[英]writing a csv file using Buffered writer in Java
我正在使用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
而是使用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();
它可以正確格式化數據,但是現在的問題是,當我第二次運行代碼時,創建了第二個文件,並且新文件包含重復的行,對於第一個文件中的每一行,第二個文件中的每一行都有相似數據的兩行。
我不是在清理一些資源嗎?
謝謝
編寫CSV文件時,您需要像這樣封裝數據
csvOutput.write("\"");
csvOutput.write(signal.getSource());
csvOutput.write("\"");
csvOutput.write(",\"")
csvOutput.write("\"");
csvOutput.write(signal.getName()
csvOutput.write("\"");
您需要執行此操作,因為如果數據中包含逗號,則在解析時會引起問題,並使數據存放在不同的列中。 同時確保里面的finally塊
finally {
//csvOutput is closed here
}
如果要在Excel中使用單獨的列,請使用您在代碼中編寫的字段,而不要使用fw.append(",");
只需給出fw.append(";");
它將有效並用於設置標頭,而不是創建像String f="Id, Name, Salary"
這樣的變量並將該變量傳遞給方法fw.append(f);
只需傳遞字段,而不是使用分號創建像fw.append("Id; Name; Salary")
這樣的變量。
據我了解,您的實際數據並沒有與列對齊,因為無法知道列的寬度。
您可以嘗試使用制表符,也可以預定義每列的寬度(例如將它們全部設置為10個字符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.