2013-09-26 13 views
8

Ich schreibe eine CSV-Datei mit gepufferten Writer in Java. Meine Daten sind korrekt geschrieben, aber ich möchte verschiedene Spalten haben, unter denen die Daten kommen. Momentan schreibt sie jede Instanz von Datum in eine Zeile, aber nicht durch Spalten getrennt.Schreiben einer CSV-Datei mit Buffered Writer in Java

Der Code ist

DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); 
     File file = new File(dirName + "\\"+ df.format(new Date()) +"_Statistics.csv"); 
     if (!file.exists()) 
      file.createNewFile(); 

     FileWriter fw = new FileWriter(file); 
     writer = new BufferedWriter(fw); 
     writer.write("Message Source"); 
     writer.write("Message Name"); 
     writer.write("Component"); 
     writer.write("Occurance"); 
     writer.write("Message Payload"); 
     writer.write("Bandwidth (Payload)"); 
     writer.write("Message Payload with Header"); 
     writer.write("Bandwidth (Payload with Header)"); 
     writer.newLine(); 
     for (Signal signal : messages) { 
      writer.write(signal.getSource()); 
      writer.write(signal.getName()); 
      writer.write(signal.getComponent()); 
      writer.write(Integer.toString(signal.getOccurance())); 
      writer.write(Integer.toString(signal.getSize())); 
      writer.write(Float.toString(signal.getBandwidth())); 
      writer.write(Integer.toString(signal.getSizewithHeader())); 
      writer.write(Float.toString(signal.getBandwidthWithHeader())); 
      writer.newLine(); 
     } 
     writer.flush(); 
     writer.close(); 
     fw.close(); 

Gibt es eine Möglichkeit, die Daten spaltenweise zu trennen, so dass es richtig lesbar ist?

EDIT

Statt gepufferte Writer ich CSVReader Bibliothek für Java. jetzt http://www.csvreader.com/java_csv.php Der Code ist

DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); 
     File file = new File(dirName + "\\"+ df.format(new Date()) +"_Statistics.csv"); 
     if (!file.exists()) 
      file.createNewFile(); 

     // Use FileWriter constructor that specifies open for appending 
     CsvWriter csvOutput = new CsvWriter(new FileWriter(file, true), ','); 

     //Create Header for CSV 
     csvOutput.write("Message Source"); 
     csvOutput.write("Message Name"); 
     csvOutput.write("Component"); 
     csvOutput.write("Occurance"); 
     csvOutput.write("Message Payload"); 
     csvOutput.write("Bandwidth (Payload)"); 
     csvOutput.write("Message Payload with Header"); 
     csvOutput.write("Bandwidth (Payload with Header)"); 
     csvOutput.endRecord(); 
     for (Signal signal : messages) { 
      csvOutput.write(signal.getSource()); 
      csvOutput.write(signal.getName()); 
      csvOutput.write(signal.getComponent()); 
      csvOutput.write(Integer.toString(signal.getOccurance())); 
      csvOutput.write(Integer.toString(signal.getSize())); 
      csvOutput.write(Float.toString(signal.getBandwidth())); 
      csvOutput.write(Integer.toString(signal.getSizewithHeader())); 
      csvOutput.write(Float.toString(signal.getBandwidthWithHeader())); 
      csvOutput.endRecord(); 
     } 
     csvOutput.flush(); 
     csvOutput.close(); 

Es richtig die Daten formatiert, aber das Problem ist jetzt, wenn ich den Code für die 2. Mal, wenn eine zweite Datei ausgeführt wird erstellt und die neue Datei enthält duplizierte Zeilen, für jede Zeile in dem ersten Datei gibt es 2 Zeilen in der 2. Datei mit ähnlichen Daten.

Ist das nicht einige Ressourcen zu reinigen?

Dank

+4

Säulen sollten durch ein Komma getrennt werden – tim

+0

@ Tim Sie bedeuten nach jedem schreibe ich sollte writer.write tun („“); – Wearybands

+2

Sie könnten das tun - es scheint, dass sie in den Spaltennamen und in den Daten fehlen. Damit das Dokument korrekt formatiert wird, sollte jede Spalte durch ein Komma getrennt sein. Für eine .csv trotzdem – tim

Antwort

-1

Von dem, was ich Ihre aktuellen Daten zu verstehen sind mit den Säulen nicht Schlange, weil es keine Möglichkeit für sie zu wissen, wie breit die Spalte.

Sie könnten versuchen, Tabs zu verwenden, oder die Breite jeder Spalte vordefinieren (wie sie alle 10 Zeichen machen).

+0

Ja etwas wie 'writer.write (" \ t ");' (Tab-Zeichen) –

0

Wenn Sie eine separate coloumn in Excel, für die Felder haben wollen, die Sie in Ihrem Code geschrieben haben, so dass anstelle von fw.append(","); Gib fw.append(";"); Es wird funktionieren und für die Header-Einstellung, sondern eine Variable zu schaffen wie String f="Id, Name, Salary" und übergibt diese Variable an die Methode fw.append(f); Einfach die Felder übergeben, anstatt die Variable wie fw.append("Id; Name; Salary") mit Semikolon zu erstellen.

1

Wenn Sie eine CSV-Datei schreiben Sie benötigen, um Ihre Daten wie diese

csvOutput.write("\""); 
csvOutput.write(signal.getSource()); 
csvOutput.write("\""); 
csvOutput.write(",\"") 
csvOutput.write("\""); 
csvOutput.write(signal.getName() 
csvOutput.write("\""); 

einzuschließen Und Sie müssen dies tun, weil, wenn es ein Komma innerhalb eines Daten ist, würde es ein Problem verursachen beim Parsen und verursachen Daten in verschiedenen Spalten untergebracht werden. Vergewissern Sie sich auch im Inneren schließlich blockieren

finally { 
//csvOutput is closed here 

}