Apache常用CSVParser / CSVRecord为空字段

时间:2016-01-12 01:27:48

标签: java csv

所有

我对Apache常见的CSVParser / CSVRecord有疑问。请看下面的CSV文件:

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

CSVParser / CSVRecord为前两列返回“”。在我的情况下,我想区分空字符串(“”)和空值。是否有我可以设置的配置让CSVParser为第二列返回null?

谢谢。

4 个答案:

答案 0 :(得分:2)

我使用过这种格式:

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

2种配置:

  1. 忽略空间 - 修剪两边的任何值,如果是全部空格,则将其修剪为空白区域
  2. null string - 将空格视为空
  3. 以下是一个示例用法:

    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"));
        }
    }
    

答案 1 :(得分:0)

我认为uniVocity-parsers是唯一允许您将空字符串与空字符串区分开来的库(我知道这不会直接解决您的Apache Commons CSV问题,但至少在那里&#39 ;获得所需的方式)。

以下是如何操作:

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许可证)。

答案 2 :(得分:0)

最后,我没有找到一个很好的解决方案,可以使用Apache Commons CSV库返回null。我切换到OpenCSV 3.6,这是我使用的代码,我也发布在another thread上。感谢所有提出OpenCSV的人。

CSVReaderBuilder为此目的使用withFieldAsNull()。

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

答案 3 :(得分:0)

在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值。