所有
我对Apache常见的CSVParser / CSVRecord有疑问。请看下面的CSV文件:
Header1,Header2,Header3
"",,"L1C3"
CSVParser / CSVRecord为前两列返回“”。在我的情况下,我想区分空字符串(“”)和空值。是否有我可以设置的配置让CSVParser为第二列返回null?
谢谢。
答案 0 :(得分:2)
我使用过这种格式:
CSVFormat.RFC4180.withFirstRecordAsHeader()
.withIgnoreSurroundingSpaces()
.withNullString("")
2种配置:
以下是一个示例用法:
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
值。