OpenCSV 不转义引号 (")
OpenCSV not escaping the quotes(")
我有一个 CSV 文件,其中引号内有定界符或未闭合的引号,如何让 CSVReader 忽略引号内的引号和定界符。
例如:
123|Bhajji|Maga|39|"I said Hey|" I am "5|'10."|"I a do "you"|get that"
这是文件的内容。
下面的程序读取 csv 文件。
@Test
public void readFromCsv() throws IOException {
FileInputStream fis = new FileInputStream(
"/home/netspurt/awesomefile.csv");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
CSVReader reader = new CSVReader(isr, '|', '\"');
for (String[] row; (row = reader.readNext()) != null;) {
System.out.println(Arrays.toString(row));
}
reader.close();
isr.close();
fis.close();
}
我得到了 o/p 这样的东西。
[123, Bhajji, Maga, 39, I said Hey| I am "5|'10., I am an idiot do "you|get that]
在you
之后引用发生了什么
编辑:
Opencsv 依赖项
com.opencsv
打开csv
3.4
来自com.opencsv:opencsv:
的源代码
/**
* Constructs CSVReader.
*
* @param reader the reader to an underlying CSV source.
* @param separator the delimiter to use for separating entries
* @param quotechar the character to use for quoted elements
* @param escape the character to use for escaping a separator or quote
*/
public CSVReader(Reader reader, char separator,
char quotechar, char escape) {
this(reader, separator, quotechar, escape, DEFAULT_SKIP_LINES, CSVParser.DEFAULT_STRICT_QUOTES);
}
见http://sourceforge.net/p/opencsv/source/ci/master/tree/src/main/java/com/opencsv/CSVReader.java
有一个带有附加参数转义的构造函数,它允许转义分隔符和引号(根据 javadoc)。
您需要转义字段中的引号。默认转义字符是 \
猜测您要转义字符串的引号应该是什么样子
123|Bhajji|Maga|39|"I said \"Hey I am \"5'10. Do \"you\" get that?\""
由于 CSV 格式指定引号 ("),如果它在字段内,我们需要在它前面加上另一个引号 (")。所以这解决了我的问题。
123|Bhajji|Maga|39|"I said Hey|"" I am ""5|'10."|"I a do ""you""|get that"
抱歉,我没有足够的代表来添加评论,所以我必须添加一个答案。
对于你最初的问题,你之后的引述发生了什么,答案与 I 之前的引述发生了什么。
对于 CSV 数据,分隔符前后的引号是字段数据的开始和结束,因此被删除。这就是缺少这两个引号的原因。
我有一个 CSV 文件,其中引号内有定界符或未闭合的引号,如何让 CSVReader 忽略引号内的引号和定界符。 例如:
123|Bhajji|Maga|39|"I said Hey|" I am "5|'10."|"I a do "you"|get that"
这是文件的内容。
下面的程序读取 csv 文件。
@Test
public void readFromCsv() throws IOException {
FileInputStream fis = new FileInputStream(
"/home/netspurt/awesomefile.csv");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
CSVReader reader = new CSVReader(isr, '|', '\"');
for (String[] row; (row = reader.readNext()) != null;) {
System.out.println(Arrays.toString(row));
}
reader.close();
isr.close();
fis.close();
}
我得到了 o/p 这样的东西。
[123, Bhajji, Maga, 39, I said Hey| I am "5|'10., I am an idiot do "you|get that]
在you
编辑: Opencsv 依赖项 com.opencsv 打开csv 3.4
来自com.opencsv:opencsv:
的源代码 /**
* Constructs CSVReader.
*
* @param reader the reader to an underlying CSV source.
* @param separator the delimiter to use for separating entries
* @param quotechar the character to use for quoted elements
* @param escape the character to use for escaping a separator or quote
*/
public CSVReader(Reader reader, char separator,
char quotechar, char escape) {
this(reader, separator, quotechar, escape, DEFAULT_SKIP_LINES, CSVParser.DEFAULT_STRICT_QUOTES);
}
见http://sourceforge.net/p/opencsv/source/ci/master/tree/src/main/java/com/opencsv/CSVReader.java
有一个带有附加参数转义的构造函数,它允许转义分隔符和引号(根据 javadoc)。
您需要转义字段中的引号。默认转义字符是 \
猜测您要转义字符串的引号应该是什么样子
123|Bhajji|Maga|39|"I said \"Hey I am \"5'10. Do \"you\" get that?\""
由于 CSV 格式指定引号 ("),如果它在字段内,我们需要在它前面加上另一个引号 (")。所以这解决了我的问题。
123|Bhajji|Maga|39|"I said Hey|"" I am ""5|'10."|"I a do ""you""|get that"
抱歉,我没有足够的代表来添加评论,所以我必须添加一个答案。
对于你最初的问题,你之后的引述发生了什么,答案与 I 之前的引述发生了什么。
对于 CSV 数据,分隔符前后的引号是字段数据的开始和结束,因此被删除。这就是缺少这两个引号的原因。