我有以下代码:
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.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"; //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(); } } }
但是,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行数。但是,仅显示原始数据集的最后一行。
我认为这可能是由于CSV行之间缺少换行符引起的。
实际上,当您在文件中写一行时,您不会写换行符。您可以writer.append(System.lineSeparator())在每个读取行之后编写它:
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语句中:
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
替换为:
以此不使用此模式:
FileWriter writer = new FileWriter("src/dataNew/BelgiumNew1.csv", false);