Java commons csv:QuoteMode.MINIMAL引号太多?
我正在使用JavaJava commons csv:QuoteMode.MINIMAL引号太多?,java,csv,apache-commons,quoting,Java,Csv,Apache Commons,Quoting,我正在使用Javaorg.apache.commons.csv(1.8版)和quote模式来编写一个csv文件 我想知道在引用单元格“foo bar”时是否会出现以下引用行为: csvPrinter.printRecord("eggs", "foo bar ", "spam"); 在输出中给出: eggs,"foo bar ",spam 我的期望是双引号不应该出现在最小引号模式下 这里有一个简单的例子: import java.io.BufferedWriter; import ja
org.apache.commons.csv
(1.8版)和quote模式来编写一个csv文件
我想知道在引用单元格“foo bar”
时是否会出现以下引用行为:
csvPrinter.printRecord("eggs", "foo bar ", "spam");
在输出中给出:
eggs,"foo bar ",spam
我的期望是双引号不应该出现在最小引号模式下
这里有一个简单的例子:
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.QuoteMode;
@Test
public void test() throws IOException {
CSVFormat csvFormat = CSVFormat.EXCEL
.withQuoteMode(QuoteMode.MINIMAL);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);
csvPrinter.printRecord("eggs", "foo bar ", "spam");
csvPrinter.flush();
csvPrinter.close();
}
为便于比较,使用Python熊猫打印的同一记录不包含引号:
import pandas
import sys
import csv
df = pandas.DataFrame({'a': ['eggs'], 'b': ['foo bar '], 'c': ['spam']})
df.to_csv(sys.stdout, quoting= csv.QUOTE_MINIMAL)
,a,b,c
0,eggs,foo bar ,spam <<< No quotes!
导入熊猫
导入系统
导入csv
数据帧({'a':['eggs'],'b':['foobar'],'c':['spam']})
df.to_csv(sys.stdout,quoting=csv.QUOTE_MINIMAL)
,a,b,c
0、Oggs、foo bar、spam查看CSVFormat
,当单元格以空格或任何数字值较低的字符(即制表符或换行符)结尾时,会添加引号
static final char SP = ' ';
...
case MINIMAL:
...
if (!quote) {
pos = end - 1;
c = value.charAt(pos);
// Some other chars at the end caused the parser to fail, so for now
// encapsulate if we end in anything less than ' '
if (c <= SP) {
quote = true;
}
}
static final char SP='';
...
最小情况:
...
如果(!quote){
pos=结束-1;
c=数值字符(位置);
//最后的一些其他字符导致解析器失败,所以现在是这样
//如果我们以小于“”结尾,则封装
if(c)