unerklärliches Verhalten von Scanner

temp_user

Mitglied
Hallo,
also ich habe ein Problem mit dem Scanner.

Fragestellung: Zwei Textdateien sollen zu einer CSV zusammengefügt werden und zwar immer so:

erste Zeile Datei1, erste Zeile Datei2(Ohne ID)
zweite Zeile Datei1, zweite Zeile Datei2(Ohne ID)
usw.

Es gibt noch ein paar Feinheiten dabei:
in einer Textdatei sind Nachkommastellen, wenn sie 0 sind abgeschnitten, dh nicht 5.0, sonder nur 5.
in dieser Textdatei sind auch keine Kommas vorhanden, in der anderen schon..

Das Ergebnis soll eine CSV File sein.
Es funktioniert grundsätlich, nur dass ich dann ab der 10. Zeile auf einmal 2 ',' hintereinander habe. Ich weiß nicht wo genau der Fehler liegt, aber igendwo wirds ne Kleinigkeit sein...
Die beiden Dateien habe ich hier abgelegt

Wenn jemand einen anderen Lösungsvorschlag hat, bin ich auch nicht abgeneigt, aber wärs dann super wenn er/sie es dann auch gleich programmiert, is ja nicht viel Arbeit(dieser Satz wird viel zu oft gesagt, trifft aber hier zu)


hier mal der Code:
Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;


public class CSVMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		System.out.println("Sers Wölt");

		File knoten = new File("C:\\knoten.txt");
		File deformation = new File("C:\\deformation.txt");
		String knotenString = "";
		String deformationString = "";
		String gesamtString = "";
		try {
			
			int knotenZähler = 0;
			int deformationZähler = 0;
			Scanner knotenScan = new Scanner(knoten);
			Scanner deformationScan = new Scanner(deformation);
			while(knotenScan.hasNext()&&knotenZähler/4 < 5000)
			{knotenZähler++;
				String temp = knotenScan.next();
				if(temp.endsWith("."))
					{
					temp=temp+"0";
					
					}
				if(temp.endsWith(".,"))
				{
						temp=temp.subSequence(0, temp.length()-1)+"0,";	
				}
				
				knotenString= knotenString+temp;
				if(knotenZähler%4 == 0)
					{
					knotenString = knotenString+",";
					
					}
				deformationZähler++;
				if(deformationZähler%4 ==0)
				{
					deformationString= deformationString+deformationScan.next()+";";
				}
				else
				{
					deformationString= deformationString+deformationScan.next()+",";
				}
				if(knotenZähler%4==0)
				{
					gesamtString +="\n"+ knotenString+deformationString.substring(2);
					knotenString="";
					deformationString = "";
					if((knotenZähler/4)%1000 ==0)System.out.println(knotenZähler/4+": "+gesamtString);
				
				}
			}
			
			System.out.println(gesamtString);
			try {
				FileWriter fw = new FileWriter("C:\\csv.csv");
				fw.write(gesamtString);
				fw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(knotenString);
		
	}

}
 
Vermutlich liegt es an Zeile 58.
Solange die Zahlen einstellig bleiben löscht er "x," komplett (2 Zeichen). Wenn die allerdings 2-stellig ("xy,") werden löscht er auch nur die ersten 2 Zeichen ("xy") und es bleibt ein Komma stehen
 
Wenn jemand einen anderen Lösungsvorschlag hat, bin ich auch nicht abgeneigt, aber wärs dann super wenn er/sie es dann auch gleich programmiert, is ja nicht viel Arbeit(dieser Satz wird viel zu oft gesagt, trifft aber hier zu)
War wirklich nicht viel Arbeit.

Warum schreibst Du die Zeilen nicht direkt wieder in die csv-Datei raus? Das ganze in einem String zu sammeln (dafür gibt's übrigens StringBuffer und StringBuilder) ist ganz schön aufwendig.

Java:
public static void main(String[] args) {
	File knoten = new File("C:\\knoten.txt");
	File deformation = new File("C:\\deformation.txt");
	File outputFile = new File("C:\\csv.csv");
	BufferedReader reader1, reader2;
	PrintWriter printer;
	try {
		reader1 = new BufferedReader(new FileReader(knoten));
		reader2 = new BufferedReader(new FileReader(deformation));
		printer = new PrintWriter(new FileWriter(outputFile));
		String tmp1, tmp2 = null;
		while((tmp1=reader1.readLine())!=null && (tmp2=reader2.readLine())!=null) {
			tmp1 = tmp1.trim().replaceAll("\\s+", "").replaceAll("\\.,", ".0,").replaceAll("\\.$", ".0");
			tmp2 = tmp2.trim().replaceAll("^\\d+\\s*", "").replaceAll("\\s+", ",").replaceAll("\\.,", ".0,").replaceAll("\\.$", ".0");
			printer.println(tmp1 + "," + tmp2);
		}
		if (tmp1!=null || (tmp2=reader2.readLine())!=null) {
			System.out.println("Fehler: Unterschiedliche Zeilenanzahl in den eingelesenen Dateien!");
			System.out.println(tmp1 + ": " + tmp2);
		}
			
		printer.close();
		reader1.close();
		reader2.close();
	}
	catch (Exception exc) {
		exc.printStackTrace();
	}
}
 

Neue Themen


Zurück
Oben