我正在尝试使用OpenCSV解析一个CSV文件。其中一列以YAML序列化格式存储数据,并被引用,因为它可以包含逗号。它也包含引号,所以通过添加两个引号将其转义。我可以在Ruby中轻松解析此文件,但使用OpenCSV无法完全解析它。它是一个UTF-8编码的文件。
下面是我的Java代码片段,它试图读取文件
CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilePath), "UTF-8"), ',', '\"', '\\');
这是这个文件中的两行。第一行没有被正确解析,并且在""[Fair Trade Certified]""
处被分割,我猜是因为转义的双引号。
1061658767,update,1196916,Product,28613099,Product::Source,"---
product_attributes:
-
- :name: Ornaments
:brand_id: 49120
:size: each
:alcoholic: false
:details: ""[Fair Trade Certified]""
:gluten_free: false
:kosher: false
:low_fat: false
:organic: false
:sugar_free: false
:fat_free: false
:vegan: false
:vegetarian: false
",,2015-11-01 00:06:19.796944,,,,,,
1061658768,create,,,28613100,Product::Source,"---
product_id:
retailer_id:
store_id:
source_id: 333790
locale: en_us
source_type: Product::PrehistoricProductDatum
priority: 1
is_definition:
product_attributes:
",,2015-11-01 00:06:19.927948,,,,,,
3条答案
按热度按时间wnavrhmk1#
首先,我很高兴FastCSV能为您工作,但我运行了可疑的子字符串,并通过3.9 openCSV运行了它,它与CsvParser和RFC 4180 Parser都工作。您能否给予一点细节,说明它如何无法解析和/或尝试使用3.9 openCSV,看看是否会遇到相同的问题,然后尝试以下配置。
以下是我使用的测试:
CSV解析器:
RFC 4180解析器
chhqkbe12#
解决方案是使用RFC4180兼容的CSV解析器,如Paul所建议的。我使用了OpenCSV的CSVReader,它不工作,或者我不能让它正常工作。
我使用了FastCSV,一个RFC4180 CSV解析器,它可以无缝地工作。
5anewei63#
我知道这是一个老问题,但在使用OpenCSV时偶然发现了这个问题,这里有一个我发现的解决方法。
基本上,当你循环你的值并期望一个列有一个逗号','时,只需要做一个基本的字符串操作,并在字符串的开头和结尾加上双引号'"'。
并且只使用CSVWriter.NO_QUOTE_CHARACTER、CSVWriter.NO_ESCAPE_CHARACTER作为CSVWriter的构造函数
作为输入的示例csv行值:《美国总统》(1995),喜剧|戏剧|浪漫,0,0
作为输出的示例csv行值:《美国总统》(1995),喜剧|戏剧|浪漫,0,1