每行写入新的CSV文件(JAVA)

时间:2016-12-19 13:14:56

标签: java csv filewriter writer

我有以下代码:

.vertical

我的控制台中的代码输出,使用System.out.println(line)给出了正确的输出。 但是,当我打开CSV文件时,似乎它被反转写入。 Excel首先抱怨行数。 但是,只显示原始数据集的最后一行。 数据集(以低效方式预处理)包含超过1000行。因此,我不能简单地追加每一个条目。

有更好的方法吗?

非常欢迎提示和技巧。 更确切地说,我曾尝试过几位作家: - CSVwrite - BufferedWriter - FileWriter

还检查了Stackoverflow上的其他问题...... 似乎无法使其发挥作用。谢谢!

更新:

问题得到解答!最终代码:

public static void main(String[] args) throws IOException {
        //File being read:
        String fileName = "src/data/Belgium.csv";


    String[] nextLine;

    try (CSVReader reader = new CSVReader(new FileReader(fileName), ',', '"', 1)) {


        while ((nextLine = reader.readNext()) != null) {

            for (String line : nextLine) {
                //NewFile
                //When 2nd parameter - ture, it gets so big, that excel can't handle it anymore...
                FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", true);

                line = line.replaceAll("T", " ");
                line = line.replaceAll("Z", "");
                line = line.replaceAll("ActualGenerationPerUnit.mean", "");
                line = line.replaceAll("Plantname:", "");
                //Escaping curly braces is a must!
                line = line.replaceAll("\\{", "");
                line = line.replaceAll("\\}", "");

                writer.append(line);
                writer.flush();
                writer.close();

                System.out.println(line);
            }
        }System.out.println("Successfully written");
    }
}

2 个答案:

答案 0 :(得分:2)

  

但是,当我打开CSV文件时,它似乎已被写入   逆转。 Excel首先抱怨行数。然而,   只显示原始数据集的最后一行。

我认为这可能是因为缺少CSV行之间的新行字符而引起的。

实际上,当你在文件中写一行时,你不会写一个新的行字符。 您可以在每条读取行之后编写它:writer.append(System.lineSeparator())

附注:

1)为什么不在循环之前移动它(否则效率较低):

FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", true);

2)你不应该在每条读取线上刷新和关闭文件,因为效率较低:

writer.append(line);
writer.flush();
writer.close();
System.out.println(line);

这应该足够了:

writer.append(line);
System.out.println(line);

保持这一点:

writer.flush();
writer.close();

finally语句中,例如:

FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", true);

try{
  // all your operations to handle the file
}

catch(Exception e){
  // your exception handling
}

finally{
   if (writer!=null){
      writer.flush();
      writer.close();
   }
}

编辑回答评论:

如果您认为输出文件包含多组记录,则可能与您使用的FileWriter的附加模式有关。

替换:

FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", true);

由此不使用此模式:

FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", false);

答案 1 :(得分:0)

我看到你正在使用opencsv来读取你的csv文件。除了davidxxx的正确答案之外,如果您使用opencsv中的CSVWriter写入文件,您可以简单地使用您的代码。以下是一个例子:

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class Example1 {

    public static void main(String args[]) throws IOException {                              
         String fileName = "src/data/Belgium.csv";
         CSVReader reader = new CSVReader(new FileReader(fileName), ',','"',1);
         List<String[]> lines = reader.readAll();         
         CSVWriter writer = new CSVWriter(new FileWriter("src/data/BelgiumNew1.csv",false), ',');
         for(String[] row : lines){
             for(int i = 0; i< row.length; i++){
                row[i] = row[i].replaceAll("T", " ")
                         .replaceAll("Z", "z")
                         .replaceAll("ActualGenerationPerUnit.mean", "")
                         .replaceAll("Plantname:", "")
                         .replaceAll("\\{", "")
                         .replaceAll("\\}", "");                 
             }
             writer.writeNext(row);
         }
         writer.flush();
         writer.close();
    }
}