簡體   English   中英

在Java中使用Buffered writer編寫csv文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM