下面是我正在使用的代码片段:
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)\
也是一般的转义字符,例如\t
(制表符)或\n
(换行符)。
由于'e'
不在要转义的字符列表中,因此\
被忽略并删除。
因此,如果您要编写“t\\\est”
文件,则该文件将包含“t\\est”
(转义反斜杠),并在读取后显示“t\est”
。或者编写“\\test”
可能会在读取后显示选项卡
和“est”
。
要使\
在读取后保持不变,您确实必须告诉解析器以某种方式忽略这些序列,但在我看来,当前的行为并不矛盾--实际上,它们都将\
视为转义字符。
我想使用opencsv中的CSVReader来读取一串逗号分隔的值。在过去,我已经将该读取器用于多部分文件,其中将完成以下操作:CSV reader reader = new CSV reader(new InputStreamReader(filename . getinputstream()); 这对于一个多部分文件来说很好,但是如果我只是想传递一个字符串,例如一行CSV,我就找不到解决方案。
大家好,Netbeans(像大多数IDE一样)使用点(.)组织小数点,对吗?我不知道为什么,但我的IDE开始使用逗号(,)来组织小数点。。。甚至控制台中显示的输出也使用逗号。如何将其更改回默认设置并再次开始使用小数点? PS:当我尝试使用点和小数位数(例如4.5)输入数字时,我会收到以下错误消息:
Windows中使用的默认unicode字符编码是什么?特别是在Windows编程中(Win32和WinRT)。当我在WinAPI中编程时,“char”映射到1字节字符存储,“wchar_t”映射到2字节字符存储。如果UTF-16用4个字节编码所有超过65536的字符,那么Windows如何将这些字符映射为“wchar_t”数据类型?我知道我的问题不够清楚,但我希望你能理解我的一些担忧。非常感谢!
问题内容: 为什么这段代码会引发SyntaxError? 尽管以下代码段运行时没有可见错误: 问题答案: 必须将所有必需的参数放在任何默认参数之前。仅仅是因为它们是强制性的,而默认参数不是必需的。从语法上讲,如果允许使用混合模式,解释器将 无法 决定哪些值与哪些参数匹配。如果参数的输入顺序不正确,则会引发A : 让我们使用您的函数来查看关键字参数。 假设其允许声明函数如上,然后使用上述声明,我们可
问题内容: 在python2中: 在python3中: 为什么这里有字节? 编辑 : 我认为当字符串具有非ascii字符时,python3会将字节附加到字符串中。(如@Ashraful伊斯兰教所说) 那么如何在python3中避免这种情况呢? 问题答案: 考虑以下代码片段: 使用Python 2运行此命令,然后使用以下命令查看结果: 等等。不出意外;从到128个字节。 对Python 3做同样的事