2013-09-26 47 views
8

我正在使用java中的緩衝寫入器寫入一個csv文件。我的數據寫入正確,但我想有不同的列下的數據來,目前它正在寫一個行的每個日期實例,但不是由列分隔。使用Java中的緩衝寫入器編寫csv文件

的代碼是

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

有什麼辦法,使其正確地讀取到數據逐列分開?

編輯

而不是使用緩衝作家的我用CSVReader庫的Java。 http://www.csvreader.com/java_csv.php 代碼現在是

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

它正確格式化數據,但現在的問題是,當我運行創建第二個文件和新的文件包含重複的行,每一行中第一個爲第二次代碼文件中第二個文件中有兩行具有相似的數據。

難道我不是在清理一些資源嗎?

感謝

+4

列應以逗號分隔 – tim

+0

@tim你的意思後,每寫我應該做的writer.write(「」); – Wearybands

+2

你可以這麼做 - 它看起來在列名和數據中都沒有。爲了使文檔正確格式化,每列應以逗號分隔。對於.csv無論如何 – tim

回答

-1

據我瞭解您的實際數據不排隊與列,因爲沒有辦法爲它知道列有多寬。

您可以嘗試使用製表符或預定義每列的寬度(如使它們全部爲10個字符)。

+0

有點像'writer.write(「\ t」);'(製表符) –

0

如果你想在Excel中一個單獨的coloumn,對你已經寫在你的代碼,這樣,而不是fw.append(","); 領域只要給​​ 它會工作,並設置頁眉,而不是創造一個像String f="Id, Name, Salary"變量並將該變量傳遞給方法fw.append(f); 只需傳遞字段,而不是使用分號創建變量 ,如fw.append("Id; Name; Salary")

1

當寫你需要附上這樣

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

您的數據的CSV文件,你需要做的,因爲如果有一個數據中的逗號會引起一個問題,同時解析和造成數據被寄存在不同的列中。另外,還要確保內部finally塊

finally { 
//csvOutput is closed here 

}