如果 CSV 文件包含三列并且值如下所示
a,b,c
//empty line
,,,
a,b,c
有两条有效记录。使用 Apache commons CSV 解析器,我可以轻松跳过有空行的记录。但是当记录只包含空值时,如何跳过它呢?
为了克服这个问题,我将 String
equals()
与已构造的空记录一起使用。这是一个示例实现。
List<String[]> csvContentsList = new ArrayList<String[]>();
CSVFormat csvFormat = CSVFormat.DEFAULT.withNullString("");
CSVParser csvParser = new CSVParser(fileReader, csvFormat);
String[] nullRecordArray = { null, null, null};
String nullRecordString = Arrays.toString(nullRecordArray);
for (CSVRecord csvRecord : csvParser) {
try {
String values[] = { csvRecord.get(0),csvRecord.get(1),csvRecord.get(2) };
if (!nullRecordString.equals(Arrays.toString(values))) //lineA
csvContentsList.add(values);
} catch (Exception e) {
// exception handling
}
}
当我不使用标记为“lineA”的行时,此实现会在 csvContentsList
中提供三个记录,如下所示
[a,b,c]
[null,null,null]
[a,b,c]
有没有内置的方法可以做到这一点?或者还有其他更好的方法吗?
最佳答案
在这里找到另一个可能的解决方案。
CSVFormat csvFormat = CSVFormat.DEFAULT.withNullString("");
CSVParser csvParser = new CSVParser(fileReader, csvFormat);
for (CSVRecord csvRecord : csvParser.getRecords()) {
String values[] = {csvRecord.get(0), csvRecord.get(1), csvRecord.get(2)};
for (String value : values) {
if (value != null) {
// as soon a value is not-null we add the array
// and exit the for-loop
csvContentsList.add(values);
break;
}
}
}
假设输入
a,b,c
,,,
d,e,f
输出
a,b,c
d,e,f
编辑如果您可以使用 Java 8,那么解决方案可能是。
List<String[]> csvContentsList = csvParser.getRecords()
.stream()
.sequential() // 1.
.map((csvRecord) -> new String[]{
csvRecord.get(0),
csvRecord.get(1),
csvRecord.get(2)
}) // 2.
.filter(v -> Arrays.stream(v)
.filter(t -> t != null)
.findFirst()
.isPresent()
) // 3.
.collect(Collectors.toList()); // 4.
- 如果行的顺序很重要
- 将 csvRecord 映射到 String[]
- 过滤至少具有一个非空值的字符串数组
- 收集所有值并返回一个列表
可能需要修改,具体取决于您的要求。
关于java - 使用 Apache Commons CSV 跳过 CSV 文件中的空记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714779/