Javaでバッファライターを使用してcsvファイルを書いています。私のデータは正しく書き込まれていますが、データが来る別の列が必要です。現在、日付の各インスタンスが1行に書き込まれていますが、列で区切られていません。
コードは
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();
データ列を適切に読み取れるように賢く分割する方法はありますか?
[〜#〜]編集[〜#〜]
バッファ付きライターを使用する代わりに、Java用のCSVReader
ライブラリを使用します。 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();
それはデータを適切にフォーマットしますが、問題は2回目のコードを2回実行したときに2番目のファイルが作成され、新しいファイルに重複行が含まれている場合です。
一部のリソースをクリーンアップしていませんか?
ありがとう
Csvファイルを書き込むときは、このようにデータを囲む必要があります
csvOutput.write("\"");
csvOutput.write(signal.getSource());
csvOutput.write("\"");
csvOutput.write(",\"")
csvOutput.write("\"");
csvOutput.write(signal.getName()
csvOutput.write("\"");
また、データ内にコンマがあると、解析中に問題が発生し、データが別の列に格納されるため、これを行う必要があります。また、最終的に内部ブロックを確認してください
finally {
//csvOutput is closed here
}
Excelで別の列を作成する場合は、コードで記述したフィールドに対してfw.append(",");
ではなくfw.append(";");
を指定するだけで機能し、代わりにヘッダーを設定します_String f="Id, Name, Salary"
_のような変数を作成し、その変数をメソッドfw.append(f);
に渡す方法セミコロンを使用してfw.append("Id; Name; Salary")
のような変数を作成する代わりに、フィールドを渡すだけです。