CSVReader无法正确读取行

时间:2013-07-17 20:38:04

标签: java csv string-formatting

我有一个包含12列的.csv文件,并使用CSVReader类读取该文件。

List<String[]> rows = reader.readAll();

但我发现一些String []的元素少于12个。当我调试时,我发现这是CSV文本格式问题。

有两个问题:

  1. 有些列以反斜杠结尾。

    例如,"Column A content\", "Column B content"将被视为一列,因为\"被视为转义字符。

  2. 某些单元格的内容中包含\"

    例如,在一行中,列A的内容是命令行: "d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >"

  3. 所以我想不出一个好的替代策略来处理这种格式问题。 (例如,将所有\替换为\\,这适用于"contentA\","contentB"情况,但在\"为单元格的内容时不起作用)

    有什么建议吗?也欢迎讨论您在CSV文件中遇到的错误格式问题和解决方案,以便Reader正确阅读问题。

2 个答案:

答案 0 :(得分:1)

我认为如果您将\",替换为\\",来解决您的问题。 很可能Unix命令行在,之后不包含\"个字符。哟可能需要将\", "扩展到\\", "或者添加空格。

特殊情况是您的上一列结束,因此\"<nl>应替换为\\"<nl>,其中<nl>是您拥有的任何行分隔符(\r\n,{{ 1}}或\r

答案 1 :(得分:0)

如果你有一行像下一行:

"Column A content\","Column B content","d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >"

尝试下一个:

CSVParser parser = new CSVParser();
String line = "\"Column A content\\\",\"Column B content\",\"d -R u+rwX \\\"\"${MYTMP}\\\"\" > /dev/null 2>&1; rm -fr \\\"\"${MYTMP}\\\"\" >\"";
line = line.replaceAll("\\\\\"(?=,)", "\\\\\\\\\"");
line = line.replaceAll("\\\\\"\"", "\\\\\"");
String[] array = parser.parseLine(line);
for (String str : array) {
    System.out.println(str);
}

输出:

Column A content\
Column B content
d -R u+rwX "${MYTMP}" > /dev/null 2>&1; rm -fr "${MYTMP}" >