Apache common CSVParser/CSVRecord为空字段返回null

hgqdbh6s  于 2023-10-13  发布在  Apache
关注(0)|答案(4)|浏览(146)

我有一个关于Apache Common CSVParser/CSVRecord的问题看看下面的CSV文件:

Header1,Header2,Header3
"",,"L1C3"

CSVParser/CSVRecord返回前两列的“”。在我的例子中,我想区分空字符串(“”)和null值。有没有一个配置可以让CSVParser为第二列返回null?

svujldwt

svujldwt1#

我使用了这种格式:

CSVFormat.RFC4180.withFirstRecordAsHeader()
   .withIgnoreSurroundingSpaces()
   .withNullString("")

其中2种配置:
1.ignore space-修剪两边的任何值,如果它是所有空格,它将被修剪为空空格
1.null string-将空格视为null
下面是一个示例用法:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import org.junit.Test;

public class CsvParseTest {

    @Test
    public void testParseWillTrimAndConvertToNull() throws Exception {
        String CSV_HEADER = "Name,MobileNo,Location";
        String CSV_ROW_1 = "abc,   ,australia"; // MobileNo is 3 whitespaces
        CSVParser parse = CSVFormat.RFC4180.withFirstRecordAsHeader().withIgnoreSurroundingSpaces().withNullString("")
                .parse(new BufferedReader(new StringReader(CSV_HEADER + "\n" + CSV_ROW_1)));

        CsvRecord rec = parse.getRecords().get(0);
        assertEquals("abc", rec.get("Name"));
        assertNull(rec.get("MobileNo"));
        assertEquals("australia", rec.get("Location"));
    }
}
vktxenjb

vktxenjb2#

我认为uniVocity-parsers是唯一一个允许你区分空字符串和null的库(* 我知道这不能直接解决你使用Apache Commons CSV的问题,但至少有一种方法可以得到你需要的东西 *)。
具体操作方法如下:

public static void main(String ... args){
    String input = "Header1,Header2,Header3\n" +
            "\"\",,\"L1C3\"";

    CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial.
    settings.setEmptyValue("I'm empty"); //value to use when the parser finds "". Set to "" to get an empty String.
    settings.setNullValue("I'm null"); //value to use when the parser finds a null value (i.e. ,,). 

    CsvParser parser = new CsvParser(settings);
    List<String[]> allRows = parser.parseAll(new StringReader(input));

    for(String[] row : allRows){
        System.out.println(Arrays.toString(row));
    }
}

这将产生以下输出:

[Header1, Header2, Header3]
[I'm empty, I'm null, L1C3]

uniVocity-parsers也比Apache Commons CSV快3倍,并且具有更多功能。
声明:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。

mec1mxoz

mec1mxoz3#

最后,我没有找到一个很好的解决方案来返回空与Apache Commons CSV库。我切换到OpenCSV 3.6,这里是我使用的代码,我也发布在另一个线程上。感谢所有推荐OpenCSV的人。
CSVReaderBuilder为此提供了withFieldAsclusion()。

CSVReader csvReader = new CSVReaderBuilder(csvFileReader)
    .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
    .build();
bd1hkmkf

bd1hkmkf4#

在Apache commons csv 1.2中,我们可以使用CSVFormat类方法withNullString()将空字符串转换为NULL。这里空字符串可以是"""N/A""Nill"根据您的要求。

CSVFormat csvFormat = CSVFormat.DEFAULT.withNullString("");
CSVParser csvParser = new CSVParser(fileReader, csvFormat);

这将为所讨论的给定记录提供给予NULL, NULL, L1C3
注意:空记录会自动转换为空字符串,最终转换为NULL值。

相关问题