如何解决使用opencsv.CSVWriter生成的CSV文件中显示的^ M个字符
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('\0'),CSVWriter.DEFAULT_ESCAPE_CHARACTER,CSVWriter.DEFAULT_LINE_END);
for (String[] row : elements) {
csvWriter.writeNext(row);
}
vim模式下的csv-
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
我应该防止这种情况吗?如果可以,怎么办?
解决方法
vip
^M
中的用于显示\r
回车符(有关其他“怪异字符”,请参见this)。
\r\n
在Windows中用作“ line ending”,而unix仅使用\n
。
这里发生的事情是您的输入文件使用\r\n
作为行尾,\r
并没有被Scanner
所“吃掉”,并最终出现在字符串中,因为您仅指定了\n
作为分隔符。
将\r\n
设置为定界符可以解决此问题或更有效的问题\r?\n
,因为useDelimiter()
的输入是一个正则表达式,?
之后的\r
表示{{1} }是可选的,通过这种方式,它将与从Windows编写的文件和从类似Unix的系统编写的文件一起正常工作。
\r
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。