java - 使用 Apache Commons CSV 跳过 CSV 文件中的空记录

标签 java csv

如果 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.
  1. 如果行的顺序很重要
  2. 将 csvRecord 映射到 String[]
  3. 过滤至少具有一个非空值的字符串数组
  4. 收集所有值并返回一个列表

可能需要修改,具体取决于您的要求。

关于java - 使用 Apache Commons CSV 跳过 CSV 文件中的空记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714779/

相关文章:

python - 属性错误: 'str' object has no attribute 'keys' error in getting json object keys

java - 如何在菜单项操作后删除 JTabbedPane 的内容

java - 解析未知的 XML 派生文件

java - String.intern() 真的能提高性能吗?

Java 日期和日历

java - JSoup 根据 Id 选择 Div,根据 title 选择 href

python - 将重复的列合并到同一数据框中

python - 如何搜索值是否在数据框中

Python CSV 读取文件并选择列并写入新的 CSV 文件

java - 如何使用 apache.commons 中的 CSVParser 以任意顺序读取 CSV 列