14. august 2006 - 11:46Der 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!
et eksempel på en linie i filen 65701591000640570159100064020500803790000100002485varenavnerher . 40W 24V E27 IM STK5030000037500100050160606100037500 00000000 00000000 00000000 STK0001000000030000 1016 098000 C 0044800000000000001016
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)); } }
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); } }
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
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.
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 ?
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.
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
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.
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); } }
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.
Forstår nu stadig ikke at det ikke virker hos dig.
Synes godt om
Ny brugerNybegynder
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.