16

我正在使用 opencsv 读取 csv 文件。

我忽略了第一行;csv 文件是制表符分隔的,一些值用双引号括起来。

当我读取具有“\”字符的列的值时会出现问题,这会从值中删除。

reader = new CSVReader(new FileReader(exchFileObj),'\t','"',1);

例如在原始文件中:

address = 12\91buenosaires   

它变成:

address = 1291buenosiares

csvreader生成的字符串数组中。如何修改它以使其也能够读取“\”字符?

4

4 回答 4

24

I had the same problem and couldn't find another character I could guarantee wouldn't show up in my csv file. According to a post on sourceforge though, you can use the explicit constructor with a '\0' to indicate that you don't want any escape character.

http://sourceforge.net/tracker/?func=detail&aid=2983890&group_id=148905&atid=773542

CSVParser parser = new CSVParser(CSVParser.DEFAULT_SEPARATOR, CSVParser.DEFAULT_QUOTE_CHARACTER, '\0', CSVParser.DEFAULT_STRICT_QUOTES);

I did a bit of cursory testing, and this seems to work just fine, at least backslashes certainly make it through.

于 2011-12-19T19:27:15.630 回答
3

CSVReader 还有一个解析器构建器,您可以通过它设置要使用的转义字符。如果您使用它并将转义字符设置为您不使用的字符,您将在输入中获得反斜杠字符。

于 2011-05-15T12:55:22.800 回答
2

除了@JMM 的答案,您还必须在 CSVReader 的构造函数中使用这个创建的 CSVParser。唯一可用的构造函数是:

public CSVReader(Reader reader, int line, CSVParser csvParser)

您可以将行设置为 0,这样它就不会跳过任何内容

于 2016-04-13T15:16:16.117 回答
2

注意:我认为这个答案中的解决方案比三个替代方案更好,因为它依靠 RFC 以粗粒度方式配置兼容的阅读器。其他答案详细介绍了配置转义字符。虽然这可行,但它似乎更像是一个白盒解决方案。

默认情况下,OpenCSV 的 reader 不符合 writer。阅读器不符合 RFC。不要问我为什么会这样,因为我觉得它和你一样令人不安和困惑。

解决方案是让您使用符合 RFC 的解析器配置 CSVReader:

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReaderBuilder csvReaderBuilder =
  new CSVReaderBuilder(new StringReader(writer.toString()))
      .withCSVParser(rfc4180Parser);
reader = csvReaderBuilder.build();

这是上面的源页面。

于 2019-08-02T15:28:20.223 回答