【问题标题】:How to read a string containing a '\' using opencsv?如何使用opencsv读取包含'\'的字符串?
【发布时间】:2013-02-11 19:44:35
【问题描述】:

当我使用 opencsv 读取 csv 文件时,当遇到字符串末尾的“\”时,它无法正常工作。它使 " 成为字符串的一部分,而不是我想要的 '\'。我想必须有一些方法可以添加另一个 '\' 让它转义 '\' 字符?没有 必须手动编辑 csv 文件。我已搜索但未找到任何内容。

为了澄清我的问题,它看起来像这样:

csv 文件

"A",       "B",        "C",       "D"
"value 1", "value 2",  "value 3", "value 4"
"value 5", "value 6\", "value 7", "value 8"

我的代码看起来像这样(不是真的,但它显示了我的问题):

String inFile = "in.csv";
CSVReader reader = new CSVReader(new FileReader(inFile));
String[] line;

while ((line = reader.readNext()) != null) {
    for (int i = 0; i < line.length(); i++) {
        System.out.println(i + " " + line[i]);
    }
}

我希望将其解析为每行包含 4 个元素的 String[],但最后一行仅解析为两个元素,如下面的输出所示。

1 A
2 B
3 C
4 D
1 value 1
2 value 2
3 value 3
4 value 4
1 value 5
2 value 6",value 7,value 8

我已尝试将阅读器更改为:

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(inFile), "UTF-8"));

但没有任何运气。

【问题讨论】:

    标签: java opencsv


    【解决方案1】:

    也许改变阅读器构造函数中的转义字符?

    CSVReader(new InputStreamReader(new FileInputStream(inFile)), ',', '"', '|') 
    

    这是假设您的 CSV 文件中没有使用 |

    【讨论】:

    • 谢谢!现在我可以按预期阅读该行了。但是,我在文件中也有字符 | 。有没有办法跳过转义字符?
    • 试试'\0'。我认为这对 CVS 无效
    • 太棒了!做到了。非常感谢!
    • @ChristofferKarlsson 很高兴为您提供帮助!
    • 谢谢。这正是我的问题的答案
    【解决方案2】:

    更简洁和推荐的解决方案是使用RFC4180Parser 而不是默认的CSVParser

    String csv = "come,csv,string";
    RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
    CSVReader csvReader = new CSVReaderBuilder(new StringReader(csv)).withCSVParser(rfc4180Parser).build(); 
    

    参考:https://sourceforge.net/p/opencsv/support-requests/50/

    【讨论】:

    • 什么是writer
    【解决方案3】:

    反斜杠用于转义",因为某些值可能包含" 字符,如果没有反斜杠,您将无法包含该字符。

    因此,如果您想使用 \,您也需要使用 \ 对其进行转义,就像您将它放在常规 Java 字符串中一样。

    "A",       "B",         "C",       "D"
    "value 1", "value 2",   "value 3", "value 4"
    "value 5", "value 6\\", "value 7", "value 8"
    

    要么修改 CSV 文件,要么使用 CSVReader 中的另一个构造函数,您可以从中选择转义字符

    【讨论】:

    • 用户明确声明他们不能修改 csv。想象一下这是从外部来源传入的脏数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2010-12-14
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多