Java commons csv:QuoteMode.MINIMAL引号太多?

Java 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

我正在使用Java
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)