^ M символов, отображаемых в CSV-файле, сгенерированном с помощью opencsv.CSVWriter

#java #csv

#java #csv

Вопрос:

Код для написания Csv

 private void writeReversalPendingCsv(List<String[]> elements) throws IOException {
    BufferedWriter writer = null;
    CSVWriter csvWriter = null;
    String fileName = null;
    ..
    writer = new BufferedWriter(new FileWriter(filePath));
            Character sep = new Character('|');
            csvWriter = new CSVWriter(writer,
                    sep,
                    new Character(''),
                    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                    CSVWriter.DEFAULT_LINE_END);
            for (String[] row : elements) {
                 csvWriter.writeNext(row);
            }
  

Csv в режиме vim —

 2|value|hello^M
2|value2|hello2
  

Чтение CSV

Перед этой частью написания я также прочитал csv того же формата.

 Scanner scanner = new Scanner(file.getInputStream());
            List<String[]> reversalPending = new ArrayList<>();
            scanner.useDelimiter("\n");
            int totalRows = 0;
            while (scanner.hasNext()) {
                   ..
                   String line = scanner.next();
                   String[] arr = line.split("\|");
                   .. processing 
                   if(processing fails) {
                       reversalPending.add(arr);
                       writeReversalPendingCsv(reversalPending);
                   }
            }
  

Я обрабатываю каждую строку и, в зависимости от некоторых условий, беру эти строки и записываю их в файл csv.

Итак, моя общая логика такова —

  • прочитать файл csv
  • обработать каждую строку
  • выгрузите необработанные строки в файл csv.

Если я использую csv-файл из выходных данных записи csv и передаю в том же потоке, обработка работает, но я получаю дополнительные ^ M —

 2|value|hello^M^M
2|value2|hello2
  

Должен ли я предотвратить это? Каким образом, если да?

Комментарии:

1. в vim ^M используется для отображения r (символ возврата каретки). rn используется в Windows как «окончание строки» , в то время как unix использует n . возможно, ваш входной файл использует rn , r не «съедается» Scanner и заканчивается в строках, потому что вы указываете n в качестве разделителя. попробуйте использовать scanner.useDelimiter("rn");

2. Спасибо, сработало, пожалуйста, добавьте в качестве ответа

Ответ №1:

в vim ^M используется для отображения r символа возврата каретки (смотрите это для других «странно выглядящих символов»).

rn используется Windows как «окончание строки«, в то время как unix использует просто n .

здесь происходит то, что ваш входной файл использует rn окончание строки, r оно не «съедается» Scanner и заканчивается в строках, потому что вы указываете только n в качестве разделителя.

установка rn в качестве разделителя устраняет проблему или даже лучше, r?n поскольку ввод useDelimiter() является регулярным выражением, ? после r означает, что r это необязательно, и таким образом это будет корректно работать как с файлами, записанными из Windows, так и с файлами, записанными из unix-подобных систем.

 scanner.useDelimiter("r?n");