web-dev-qa-db-ja.com

Java

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番目のファイルが作成され、新しいファイルに重複行が含まれている場合です。

一部のリソースをクリーンアップしていませんか?

ありがとう

8
Wearybands

Csvファイルを書き込むときは、このようにデータを囲む必要があります

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

また、データ内にコンマがあると、解析中に問題が発生し、データが別の列に格納されるため、これを行う必要があります。また、最終的に内部ブロックを確認してください

finally {
//csvOutput is closed here

}
1
shashwatZing

Excelで別の列を作成する場合は、コードで記述したフィールドに対してfw.append(",");ではなくfw.append(";");を指定するだけで機能し、代わりにヘッダーを設定します_String f="Id, Name, Salary"_のような変数を作成し、その変数をメソッドfw.append(f);に渡す方法セミコロンを使用してfw.append("Id; Name; Salary")のような変数を作成する代わりに、フィールドを渡すだけです。

0
Gitansh