Запись в строке нового CSV-файла (JAVA)

java csv filewriter writer

3598 просмотра

2 ответа

У меня есть следующий код:

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 (строка) дает мне правильный вывод. Тем не менее, когда я открываю файл 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();
        }
    }
}
Автор: lilienfa Источник Размещён: 12.11.2019 09:03

Ответы (2)


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);
Автор: davidxxx Размещён: 19.12.2016 01:28

0 плюса

Я вижу, что вы используете opencsv для чтения вашего CSV-файла. В дополнение к правильному ответу от davidxxx вы могли бы просто написать свой код, если для записи в файл используете CSVWriter из opencsv. Ниже приведен пример:

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();
    }
} 
Автор: Eritrean Размещён: 19.12.2016 02:54
Вопросы из категории :
32x32