当前位置: 首页 > 知识库问答 >
问题:

每行写入新CSV文件(JAVA)

左丘宜然
2023-03-14

我有以下代码:

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");
    }
}

使用System在我的控制台中输出代码。出来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";

    //When 2nd parameter - ture, it gets so big, that excel can't handle it anymore...
      FileWriter writer = new FileWriter("src/dataNew/BelgiumNew5.csv", true);


    String[] nextLine;

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

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

            for (String line : nextLine) {

                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.append(System.lineSeparator());
                System.out.println(line);


            }
        }System.out.println("Successfully written");
        }catch(Exception e){
        e.printStackTrace();
    }finally {
        if (writer != null){
            writer.flush();
            writer.close();
        }
    }
}

共有2个答案

东郭弘
2023-03-14

我看到您正在使用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();
    }
} 
莫欣悦
2023-03-14

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

我认为这可能是因为CSV行之间缺少一个新行字符造成的。

实际上,在文件中写入行时,不会写入新行字符。您可以编写它:<代码>编写器。在每个读取行之后追加(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();

最后语句中,例如:

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);
 类似资料:
  • 问题内容: 我有以下代码: 在控制台中,使用System.out.println(line)输出的代码为我提供了正确的输出。但是,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行数。但是,仅显示原始数据集的最后一行。数据集(以一种低效的方式进行了预处理)包含1000多个行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧非常受欢迎。更进一步,我尝试了一些编写器:-CSV

  • 问题内容: 我有一本字典: 我想以这种方式将数据写入dict.csv文件: 我写: 但是现在我将所有键都放在一行中,而所有值都在下一行中。 当我设法写一个这样的文件时,我也想将其读回到新的字典中。 只是为了解释我的代码,该词典包含来自textctrls和复选框的值和布尔值(使用wxpython)。我要添加“保存设置”和“加载设置”按钮。保存设置应以上述方式将字典写入文件(以使用户更容易直接编辑cs

  • 问题内容: 我有一个脚本(使用PhantomJS),用于测试加载网页需要多长时间。我要弄清楚的是如何写将页面加载到.csv文件所花费的时间结果。然后,如果我要重新运行测试,以将另一个结果添加到.csv文件中。 码: 问题答案: 您可以将fs模块与附加模式下的方法一起使用。 其中,文件路径是字符串,是包含CSV行的字符串。 就像是:

  • 问题内容: 将结构转储到提供的csv文件中的惯用golang方法是什么?我在一个func里面,我的结构作为接口{}传递: 为什么要使用界面{}?-从JSON读取数据,可能会返回一些不同的结构,因此尝试编写足够通用的函数。 我的类型的一个例子: 问题答案: 如果您使用具体类型,将会容易得多。您可能想要使用该软件包,这是一个相关示例;https://golang.org/pkg/encoding/cs

  • 我使用opencsv 2.3写入csv文件。 此代码将每行写入单个单元格,例如a_1“28”。 如何将写入第一列,将写入第二列? 更新1:我认为这段代码适用于opencsv 3.1,但似乎不适用于早期版本。

  • 我在文本文件中插入的代码如下: 我想将所有这些数据插入到csv文件中,但我尝试了以下方法: 如何将此数据逐行插入到带有列标题的csv文件中?