- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我正在使用的代码片段:
StringWriter writer = new StringWriter();
CSVWriter csvwriter = new CSVWriter(writer);
String[] originalValues = new String[2];
originalValues[0] = "t\\est";
originalValues[1] = "t\\est";
System.out.println("Original values: " + originalValues[0] +"," + originalValues[1]);
csvwriter.writeNext(originalValues);
csvwriter.close();
CSVReader csvReader = new CSVReader(new StringReader(writer.toString()));
String[] resultingValues = csvReader.readNext();
System.out.println("Resulting values: " + resultingValues[0] +"," + resultingValues[1]);
上述代码片段的输出是:
Original values: t\est,t\est
Resulting values: test,test
转换后反斜杠('\')字符消失!!!
通过一些基本分析,我认为发生这种情况是因为 CSVReader
使用反斜杠 ('\') 作为默认转义字符,而 CSVWriter
使用双引号 ('"') 作为默认转义字符。
默认行为不一致的原因是什么?
为了解决上述问题,我设法找到以下两个解决方案:
1) 用空字符覆盖 CSVReader 的默认转义字符:
CSVParser csvParser = new CSVParserBuilder().withEscapeChar('\0').build();
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(csvParser).build();
2) 使用严格遵循 RFC4180 的 RFC4180Parser标准:
RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser).build();
使用上述任何方法会对其他角色产生副作用吗?
另外为什么 RFC4180Parser
不是默认解析器?难道只是为了保持向后兼容性,因为 RFC4180Parser
在以后的版本中引入了?
最佳答案
我认为我们正在考虑两种类型的转义。
1) 在 csv 中转义双引号:
test,"Monitor 24"", Samsung"
test,"Monitor 24\", Samsung" // Linux style
由于我们在第二个字段中有一个逗号,因此该字段必须用双引号引起来。该字段内的任何双引号都必须使用 ""
或 \"
进行转义。
2) \
也是 general escape character ,例如 \t
(制表符)或 \n
(换行符)。
由于 'e'
不在要转义的字符列表中,因此 \
会被忽略并删除。
因此,如果您编写 "t\\\\est"
,该文件将包含 "t\\est"
(转义反斜杠)并在读取后显示 "t\est"
。或者编写 "\\test"
可能会在读取后显示 tab
和 "est"
。
要在读取后保留 \
,您确实必须以某种方式告诉解析器忽略这些序列,但当前的行为对我来说并不不一致 - 实际上它们都将 \
视为转义字符。
关于java - 为什么 CSVWriter 和 CSVReader 使用不同的默认转义字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46139735/
我想将数据保存到 CSV 文件中。我使用 Scanner 读取 -> CSVWriter 保存。 我收到错误:不兼容的类型:List[String] 无法转换为 String[]。 方法: priva
我正在尝试将数据(主要是日期、 bool 值和 float 据类型)写入 CSV 文件格式。这是我的代码片段: # Write data to file with open(OUTPUT_DIR +
Python 新手对 csv 模块感到有些沮丧。以这种速度,如果我自己编写文件解析器会更容易,但我想以 Python 的方式做事...... 我编写了一个小 Python 脚本,可以将我的数据保存到
我有一个要求,我需要用引号字符包装所有元素。 我正在使用 CSVWriter 来写这些行 CSVWriter writer = new CSVWriter(new FileWriter(rptFile
我正在使用 CSVWriter 将数据列表写入 csv。 我可以选择一个特定的单元格并创建一个要计算的数学公式吗? 例如,我希望单元格 D5 计算单元格 A1 + B2 的相加 最佳答案 我认为您对
我正在使用 OpenCSV创建充满数据库记录的 CSV 文件。我正在使用这个: CSVWriter writer = new CSVWriter( new Ou
我使用以下代码从管道分隔的 CSV 中删除引号: public Path truncateQuoteMarks(Path path) throws Exception { String pip
我正在使用csvwriter(opencsv)将sql server中的表导出到CSV文件,csv文件中的日期格式已更改。 sql server 中的实际日期格式是 YYYY-MM-DD HH:MI:
我正在使用 CsvHelper 库从我的 .net 代码读取/写入 csv 文件。 到目前为止,所有功能都运行良好,但我在使用 CsvWriter 类写入 csv 文件时如何保持前导零?目前,诸如“0
我做了一个项目,在 csv 文件中写入一些内容,但特殊字符无法正常工作,例如:à、é、ï.. 所以我更改了代码,以便 fileWriter 将以 ISO-8859-1 进行编码。 OutputStre
我正在使用 CsvHelper 类将 DataTable 中的行写入 csv 文件。代码有效,但我无法用它来编写 header 。 如何在不创建类映射的情况下手动添加 header ? http://
此代码打开 URL 并在末尾附加 /names 并打开页面并将字符串打印到 test1.csv: import urllib2 import re import csv url = ("http://
我有一个问题。我想从 CSVWriter 创建一个新的 CSV 文件,并将整个数组设置到一个单元格中。 这是我的java代码: StringWriter s = new StringWriter();
我有以下方法使用 CSVWriter 将列表写入 CSV 文件。不幸的是,它没有用逗号分隔它们,当我在 Excel 中打开它时,它们会变得很乱。我该如何修改它? private void gen
我已经尝试使用 CSVWriter 将数据库表导出为 CSV。 但是我的表包含 BLOB 数据。如何将它们包含在我的导出中? 稍后,我将使用 CSVReader 导入导出的 CSV。有人可以分享一些概
我正在尝试使用 opencsv 库来获取加密格式数据。但是在 CSV writer 上写作时,我收到“NoClassDefFoundError”。我看过很多与相同错误相关的帖子,并且几乎尝试了所有事情
这是我正在使用的代码片段: StringWriter writer = new StringWriter(); CSVWriter csvwriter = new CSVWriter(
我需要通过以下操作操作现有的 CSV 文件: 从现有的 CSV 文件中读取 -> 然后向其追加新行。 我有以下代码阻塞了第 3 行 - 因为该文件已被第 1 行的代码使用。而且我不知道如何正确读取它,
我正在使用 csvWriter,我使用它的代码可以工作。是否可以创建包含多个页面的 csv,如 Excel 文件? 以下是有关该项目的具体信息。 List listBooks = new ArrayL
我正在尝试模拟文件创建、FileWriter 操作和 CsvWriter 操作。我正在使用 EasyMock 来模拟文件创建,使用 PowerMockito 来模拟 FileWriter 和 CSVW
我是一名优秀的程序员,十分优秀!