2013-09-26 8 views
8

Piszę plik csv za pomocą buforowanego programu piszącego w języku Java. Moje dane są zapisane poprawnie, ale chcę mieć różne kolumny, pod którymi znajdują się dane. Obecnie zapisuje każde wystąpienie daty w jednym wierszu, ale nie jest rozdzielone kolumnami.pisanie pliku csv przy użyciu buforowanego programu piszącego w języku Java

Kod jest

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(); 

Czy istnieje jakiś sposób, aby oddzielić kolumny danych mądry tak, że jest odpowiednio czytelny?

EDIT

Zamiast buforowany pisarza używam CSVReader biblioteki dla Javy. http://www.csvreader.com/java_csv.php Kod jest teraz

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(); 

To właściwie formatuje dane, ale problem jest teraz gdy uruchamiam kod 2 raz 2nd plik jest tworzony i nowy plik zawiera zduplikowane wiersze, dla każdego wiersza w pierwszym plik ma 2 wiersze w drugim pliku z podobnymi danymi.

Czy to nie jest czyszczenie niektórych zasobów?

Dzięki

+4

Kolumny powinny być oddzielone przecinkiem – tim

+0

@tim znaczy po każdym napisać zrobić writer.write („”); – Wearybands

+2

Możesz to zrobić - wygląda na to, że brakuje ich w nazwach kolumn i danych. Aby dokument był poprawnie sformatowany, każda kolumna powinna być oddzielona przecinkiem. Dla .csv i tak – tim

Odpowiedz

-1

Z tego co rozumiem rzeczywiste dane nie są w kolejce z kolumnami, ponieważ nie ma sposobu na to, aby wiedzieć, jak szeroka kolumna jest.

Możesz spróbować użyć kart lub wstępnie zdefiniować szerokość każdej kolumny (np. Zrób wszystkie 10 znaków).

+0

Tak coś jak 'writer.write (" \ t ");' (znak tabulatora) –

0

Jeśli chcesz mieć kolumnowej błyskawicznej, oddzielna w programie Excel, na polach, które zostały napisane w kodzie więc zamiast fw.append(","); Dajcie fw.append(";"); To zadziała i ustawiania nagłówka, zamiast tworzyć zmienną jak String f="Id, Name, Salary" i przekazanie tej zmiennej do metody Po prostu przekazać pola zamiast tworzyć zmienną za pomocą średnika.

1

Pisząc pliku csv trzeba załączyć swoje dane jak ten

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

i trzeba to zrobić, bo jeśli tam jest przecinek w danych to spowodować problem podczas parsowania i spowodować danych do być złożone w różnych kolumnach. Również upewnić się wewnątrz wreszcie blokować

finally { 
//csvOutput is closed here 

} 
Powiązane problemy