我有一个有12列的.csv文件,并使用CSVReader类读取该文件。
List<String[]> rows = reader.readAll();
但我发现有些String[]的元素少于12个。当我调试时,我发现这是CSV文本格式的问题。
有两个问题:
有些列以反斜杠结尾。
例如,
"Column A content", "Column B content"
将被读取为一列,因为"
被视为转义符。某些细胞的内容物中含有CCD_ 3。
例如,在一行中,列A的内容是一个命令行:
"d -R u+rwX ""${MYTMP}"" > /dev/null 2>&1; rm -fr ""${MYTMP}"" >"
所以我想不出一个好的替代策略来处理这个格式问题。(例如,用\
替换所有,这适用于
"contentA","contentB"
的情况,但当"
是单元格的内容时,不适用于它)
有什么建议吗?也欢迎讨论您在CSV文件中遇到的错误格式问题和解决方案,以便读者在正确阅读时遇到问题。
我认为,如果用\",
替换",
,就会解决您的问题。最有可能的Unix命令行在"
后面不包含,
字符。Yo可能必须用", "
将其扩展到\", "
,或者可能添加空白。
特殊情况是最后一列结束时,因此"<nl>
应替换为\"<nl>
,其中<nl>
是您拥有的任何行分隔符(rn
、r
或n
)
如果你有一行像下一行:
"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}" >