Avatar billede draeber Nybegynder
14. august 2006 - 11:46 Der er 46 kommentarer og
2 løsninger

flytte data på plads 203-208 til plads 194-199

Hejsa

Jeg skal bruge en stump kode i JAVA, som kan ovenstående. Jeg har desværre ikke tid til at rode alt for meget med det selv, hvorfor jeg spørger her.

Jeg har en tekstfil, med ca. 120.000 linier.
Hver linie repræsenterer én vare.
På plads (kolonne - kald det hvad i vil): 203-208 står noget information (tal) om varegrupper.
Regnskabsystemet leder efter disse data på plads 194-199.

Nogen der kan lave en stump kode, som åbner denne fil[priser.lp] flytter data og evt. opretter en ny fil [priser_rabat_grupper.lp].
Alternativt må den også gerne skrive til samme fil igen! Det er vel egentlig nemmere at lave!
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:08 #1
Jeg går igang med at lave en løsning nu :)
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:10 #2
Vil lige høre: Kalder du den første linie i filen for 0 eller 1?

Det er rimelig afgørende.
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:12 #3
Og bruger du java 1.5? Skal jeg vide for at høre om jeg kan bruge generics :)
Avatar billede arne_v Ekspert
14. august 2006 - 13:21 #4
jeg læser altså spm. som at det er kolonner der skal flyttes ikke linier ...
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:23 #5
ohhhhhhh, ja ok. draeber må vi se et eksempel på din fil? Er de adskilt af komma eller mellemrum fx?
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:27 #6
Laver lige et eksempel på det med kolonner nu så istedet,
Avatar billede draeber Nybegynder
14. august 2006 - 13:41 #7
et eksempel på en linie i filen
65701591000640570159100064020500803790000100002485varenavnerher . 40W 24V E27 IM  STK5030000037500100050160606100037500 00000000 00000000 00000000  STK0001000000030000            1016        098000 C  0044800000000000001016
Avatar billede draeber Nybegynder
14. august 2006 - 13:42 #8
jeg bruger p.t. j2sdk 1.4.2_01
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:42 #9
Her følger en kode, der gør det du vil have.

I starten af main-metoden skal du definere stierne på de to filer (Lav en anden output-fil for en sikkerhedsskyld)

og under punkt 2., hvor der skal flyttes kolonner indtaster du de kolonner, der skal flyttes.

husk at den første kolonne hedder 0.




import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String inputFil = "c:/input.txt";//Fil der skal hentes fra
        String outputFil = "c:/output.txt";//Fil der skal skrives til
        String delimiter = " ";
       
       
        System.out.println("Program startet...");
       
        //1. Hent linierne ind
        File inputFile = new File(inputFil);
        Scanner scanner;
        try {
            scanner = new Scanner(inputFile);
        } catch (FileNotFoundException e) {
            System.out.println("Filen blev ikke fundet.");
            return;//Stopper metoden hvis filen ikke eksisterer
        }
        List<List<String>> linier = new ArrayList<List<String>>();//2D Arraylist
        while(scanner.hasNext()){
            String linieString = scanner.nextLine();//Hent næste linie
            Scanner linieScanner = new Scanner(linieString);
            linieScanner.useDelimiter(delimiter);//Definere hvad der adskiller felterne
            List<String> linie = new ArrayList<String>();
            while(linieScanner.hasNext()){
                linie.add(linieScanner.next());
            }
            linier.add(linie);
            linieScanner.close();
        }
        scanner.close();
       
        //2. Flyt rundt på linierne
        flytKolonne(linier, 4, 2);
        flytKolonne(linier, 5, 3);
        flytKolonne(linier, 6, 4);

        //3. Gem linierne igen
        PrintWriter pw;
        try {
            pw = new PrintWriter(outputFil);
        } catch (FileNotFoundException e) {
            System.out.println("Der skete en fejl i forbindelse med at gemme linierne igen.");
            return;
        }
       
        for(int i = 0; i < linier.size(); i++)
        {
            List<String> line = linier.get(i);
            for(int j = 0; j < line.size(); j++){
                pw.print(line.get(j)+delimiter);//Indsætter samme delimiter i den nye fil
            }
            pw.println();
        }
        pw.flush();
        pw.close();
       
        System.out.println("Program færdigt!");
    }
   
    private static void flytKolonne(List<List<String>> linier, int fraKolonne, int tilKolonne)
    {
        if(fraKolonne < tilKolonne){
            System.out.println("Metoden FlytKolonne er kun lavet til at kunne flytte kolonner tilbage");
            return;
        }
        for(List<String> linie : linier){
            linie.add(tilKolonne, linie.remove(fraKolonne));
        }
    }

}
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:43 #10
ok så skal jeg lige lave den så den ikke benytter generics.
Avatar billede draeber Nybegynder
14. august 2006 - 13:45 #11
en anden lille detalje.....
Det glemte jeg at skrive
Det er vigtigt at der IKKE flyttes nogle andre data rundt i filen!
Avatar billede draeber Nybegynder
14. august 2006 - 13:45 #12
således må de to datasæt gerne byttes om, men resten af filen/linien skal forblive som den er!
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:47 #13
altså skal der byttes om på f.eks. linie 198 og 203 og istedet for bare at flytte linie 203 tilbage?
Avatar billede draeber Nybegynder
14. august 2006 - 13:50 #14
nej.....
der byttes om på kolonne 198 og 203, 199 og 204 osv...
ikke linier!
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:53 #15
I know. Talefejl.

Har lavet en version der bytter om på kolonner nu og som ikke benytter generics.


import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String inputFil = "c:/input.txt";//Fil der skal hentes fra
        String outputFil = "c:/output.txt";//Fil der skal skrives til
        String delimiter = " ";
       
       
        System.out.println("Program startet...");
       
        //1. Hent linierne ind
        File inputFile = new File(inputFil);
        Scanner scanner;
        try {
            scanner = new Scanner(inputFile);
        } catch (FileNotFoundException e) {
            System.out.println("Filen blev ikke fundet.");
            return;//Stopper metoden hvis filen ikke eksisterer
        }
        List linier = new ArrayList();//2D Arraylist
        while(scanner.hasNext()){
            String linieString = scanner.nextLine();//Hent næste linie
            Scanner linieScanner = new Scanner(linieString);
            linieScanner.useDelimiter(delimiter);//Definere hvad der adskiller felterne
            List linie = new ArrayList();
            while(linieScanner.hasNext()){
                linie.add(linieScanner.next());
            }
            linier.add(linie);
            linieScanner.close();
        }
        scanner.close();
       
        //2. Flyt rundt på linierne
        bytOm(linier, 4, 2);

        //3. Gem linierne igen
        PrintWriter pw;
        try {
            pw = new PrintWriter(outputFil);
        } catch (FileNotFoundException e) {
            System.out.println("Der skete en fejl i forbindelse med at gemme linierne igen.");
            return;
        }
       
        for(int i = 0; i < linier.size(); i++)
        {
            List linie = (List)linier.get(i);
            for(int j = 0; j < linie.size(); j++){
                pw.print(linie.get(j).toString() + delimiter);//Indsætter samme delimiter i den nye fil
            }
            pw.println();
        }
        pw.flush();
        pw.close();
       
        System.out.println("Program færdigt!");
    }
   
    private static void bytOm(List linier, int kolonne1, int kolonne2)
    {
       
        for(int i = 0; i < linier.size(); i++){
            List linie = (List)linier.get(i);
            String s1 = (String)linie.get(kolonne1);
            String s2 = (String)linie.get(kolonne2);
            linie.set(kolonne1, s2);
            linie.set(kolonne2, s1);
        }
    }

}
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:55 #16
Der hvor du ser

//2. Flyt rundt på linierne
        bytOm(linier, 4, 2);

ændsætter du bare f.eks.

//2. Flyt rundt på linierne
bytOm(linier, 198, 203);
bytOm(linier, 199, 204);
bytOm(linier, 200, 205);
Avatar billede stephanryer Nybegynder
14. august 2006 - 13:56 #17
indsætter*
Avatar billede draeber Nybegynder
14. august 2006 - 13:59 #18
takker...... det vil jeg lige prøve af!
Avatar billede draeber Nybegynder
14. august 2006 - 14:02 #19
C:\j2sdk1
Main.java
symbol  :
location:
import ja

Main.java
symbol  :
location:
        S
        ^
Main.java
symbol  :
location:


Main.java
symbol  :
location:


Main.java
symbol  :
location:


Main.java
symbol  :
location:


6 errors

fandt lige ud af, at jeg også havde _07 installeret!
Avatar billede stephanryer Nybegynder
14. august 2006 - 14:04 #20
a hvad? Virker det ikke eller hvad? Får ikke så meget ud af det der :)
Avatar billede draeber Nybegynder
14. august 2006 - 14:06 #21
nej... det kan jeg godt se.... øjeblik
det virker ikke nej.....
Avatar billede draeber Nybegynder
14. august 2006 - 14:06 #22
C:\j2sdk1.4.2_07\bin>javac Main.java
Main.java:6: cannot resolve symbol
symbol  : class Scanner
location: package util
import java.util.Scanner;
                ^
Main.java:20: cannot resolve symbol
symbol  : class Scanner
location: class Main
        Scanner scanner;
        ^
Main.java:22: cannot resolve symbol
symbol  : class Scanner
location: class Main
            scanner = new Scanner(inputFile);
                          ^
Main.java:30: cannot resolve symbol
symbol  : class Scanner
location: class Main
            Scanner linieScanner = new Scanner(linieString);
            ^
Main.java:30: cannot resolve symbol
symbol  : class Scanner
location: class Main
            Scanner linieScanner = new Scanner(linieString);
                                      ^
Main.java:47: cannot resolve symbol
symbol  : constructor PrintWriter (java.lang.String)
location: class java.io.PrintWriter
            pw = new PrintWriter(outputFil);
                ^
6 errors
Avatar billede stephanryer Nybegynder
14. august 2006 - 14:13 #23
ohhh scanner-klassen er nok ny. well, hvilken version af java bruger du til henholdsvis at compile og køre det med?
Avatar billede draeber Nybegynder
14. august 2006 - 14:18 #24
1.4.2_07
Avatar billede draeber Nybegynder
14. august 2006 - 14:19 #25
men ellers må jeg da lige prøve at opgradere til 1.5 det skulle vel for pokker ikke betyde det store, for de småting jeg arbejder med
Avatar billede stephanryer Nybegynder
14. august 2006 - 14:24 #26
Well der er en masse fordele ved 1.5: f.eks. generics, enumerations og nogle nye klasser.

Hvis du opgraderer til 1.5 så er jeg sikker på det vil virke. Men brug stadig den seneste af de to koder, da den øverste kun flytter kolonner tilbage og ikke bytter om på de to, i modsætning til den sidste kode, der bytter om på de to kolonner.
Avatar billede jakoba Nybegynder
14. august 2006 - 15:46 #27
stephanryer >>

prøve at kikke på den eksempellinie han gav. Jeg tror kolonne betyder bogstavposition, så du kan bare bruge gode gamle substring() istedet for scanner.

draeber >>

men du besvarede aldrig det spørgsmål der kom. er den første kollonne nummer 0 eller nummer 1 ?
Avatar billede stephanryer Nybegynder
14. august 2006 - 16:14 #28
draeber >> Er det bare tegn du vil have flyttet?
Avatar billede draeber Nybegynder
17. august 2006 - 13:16 #29
det virker ikke..... den efterlader blot en tom fil (output.txt)
Avatar billede draeber Nybegynder
17. august 2006 - 13:16 #30
C:\Programmer\Java\jdk1.5.0_03\bin>javac Main.java
Note: Main.java uses unchecked or unsafe operations
Note: Recompile with -Xlint:unchecked for details.
Avatar billede draeber Nybegynder
17. august 2006 - 13:17 #31
C:\Programmer\Java\jdk1.5.0_03\bin>javac Main.java -Xlint:unchecked
Main.java:34: warning: [unchecked] unchecked call to add(E) as a member of the r
aw type java.util.List
                linie.add(linieScanner.next());
                        ^
Main.java:36: warning: [unchecked] unchecked call to add(E) as a member of the r
aw type java.util.List
            linier.add(linie);
                      ^
Main.java:79: warning: [unchecked] unchecked call to set(int,E) as a member of t
he raw type java.util.List
            linie.set(kolonne1, s2);
                    ^
Main.java:80: warning: [unchecked] unchecked call to set(int,E) as a member of t
he raw type java.util.List
            linie.set(kolonne2, s1);
                    ^
4 warnings
Avatar billede draeber Nybegynder
17. august 2006 - 13:17 #32
jeg ved så ikke, om det er det!
Avatar billede draeber Nybegynder
17. august 2006 - 13:50 #33
Den læser slet ikke nogen linier ind i
while(scanner.hasNext())....
Avatar billede draeber Nybegynder
17. august 2006 - 13:53 #34
hasNext() giver false!, derfor kommer den slet ikke ind i løkken, men hvorfor gør den det?
Avatar billede stephanryer Nybegynder
17. august 2006 - 21:03 #35
Sikker på du har angivet input-filens sti korrekt?
Avatar billede draeber Nybegynder
18. august 2006 - 08:08 #36
den skriver i hvert fald ikke, at den ikke kan finde den...
Avatar billede stephanryer Nybegynder
18. august 2006 - 08:45 #37
Jeg tror problemet er at programmer pt. bytte om på hele ord. Hvis ordene er skilt ad med mellemrum. Det du skal bruge er et program der kan bytte om på enkelte tegn, right?

Hvis ja, så ser jeg lige på det når jeg kommer hjem i eftermiddag.
Avatar billede draeber Nybegynder
18. august 2006 - 14:57 #38
ja, det er rigtigt!
Avatar billede stephanryer Nybegynder
18. august 2006 - 15:44 #39
Så, nu har jeg ændret den til at flytte enkelte tegn istedet for hele ord :)


import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String inputFil = "c:/input.txt";//Fil der skal hentes fra
        String outputFil = "c:/output.txt";//Fil der skal skrives til
        String delimiter = " ";

        System.out.println("Program startet...");
       
        //1. Hent linierne ind
        File inputFile = new File(inputFil);
        Scanner scanner;
        try {
            scanner = new Scanner(inputFile);
        } catch (FileNotFoundException e) {
            System.out.println("Filen blev ikke fundet.");
            return;//Stopper metoden hvis filen ikke eksisterer
        }
        List<List<Character>> linier = new ArrayList<List<Character>>();//2D Arraylist
        while(scanner.hasNext()){
            String linieString = scanner.nextLine();//Hent næste linie
            List<Character> linie = new ArrayList<Character>();
            for(int i = 0; i < linieString.length(); i++){
                linie.add(linieString.charAt(i));
            }
            linier.add(linie);
        }
        scanner.close();
       
        //2. Flyt rundt på linierne
        bytOm(linier, 4, 2);

        //3. Gem linierne igen
        PrintWriter pw;
        try {
            pw = new PrintWriter(outputFil);
        } catch (FileNotFoundException e) {
            System.out.println("Der skete en fejl i forbindelse med at gemme linierne igen.");
            return;
        }
       
        for(int i = 0; i < linier.size(); i++)
        {
            List linie = (List)linier.get(i);
            for(int j = 0; j < linie.size(); j++){
                pw.print(linie.get(j).toString() + delimiter);//Indsætter samme delimiter i den nye fil
            }
            pw.println();
        }
        pw.flush();
        pw.close();
       
        System.out.println("Program færdigt!");
    }
   
    private static void bytOm(List linier, int kolonne1, int kolonne2)
    {
       
        for(int i = 0; i < linier.size(); i++){
            List<Character> linie = (List<Character>)linier.get(i);
            char s1 = (Character)linie.get(kolonne1);
            char s2 = (Character)linie.get(kolonne2);
            linie.set(kolonne1, s2);
            linie.set(kolonne2, s1);
        }
    }
Avatar billede draeber Nybegynder
18. august 2006 - 21:19 #40
den efterlader også en tom fil!
Avatar billede draeber Nybegynder
18. august 2006 - 21:27 #41
den kommer slet ikke ind i "while(scanner.hasNext()){..."
Avatar billede stephanryer Nybegynder
19. august 2006 - 17:47 #42
sikker på der er linier i filen så?
Avatar billede draeber Nybegynder
20. august 2006 - 20:21 #43
ja, der er linier i filen.... jeg har prøvet med en med én linie og en med ca. 120.000 linier.... de giver begge tomt resultat!
Avatar billede stephanryer Nybegynder
20. august 2006 - 20:23 #44
Prøv at fjerne output-filen og se om den bliver oprettet ved kørsel af koden
Avatar billede draeber Nybegynder
21. august 2006 - 06:56 #45
den bliver oprettet fint nok...
Avatar billede stephanryer Nybegynder
21. august 2006 - 07:56 #46
Well det lyder underligt, for koden virker fint på min maskine. Der bliver ikke skrevet noget til konsollen?
Avatar billede draeber Nybegynder
04. september 2006 - 20:01 #47
det virker stadig ikke hos mig....
Men i mellemtiden er producenten af regnskabsprogrammet kommet med en opdatering, så jeg kan bruge filerne, som de er.
Jeg tillader mig at dele point mellem os, da du jo trods alt har arbejdet på det, men det dog ikke virker hos mig af en eller anden grund.

Lig bare et svar
Avatar billede stephanryer Nybegynder
04. september 2006 - 22:34 #48
svar.

Forstår nu stadig ikke at det ikke virker hos dig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester