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