Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache Commons CSV跳过CSV文件中的空记录_Java_Csv - Fatal编程技术网

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

Java 使用Apache Commons CSV跳过CSV文件中的空记录,java,csv,Java,Csv,如果CSV文件包含三列,且值如下所示 a,b,c //empty line ,,, a,b,c 有两个有效记录。使用ApacheCommonsCSV解析器,我可以轻松跳过包含空行的记录。但是当记录只包含空值时,如何跳过它呢 为了克服这个问题,我使用了Stringequals()和已经构建的空记录。下面是一个示例实现 List<String[]> csvContentsList = new ArrayList<String[]>(); CSVFormat csv

如果CSV文件包含三列,且值如下所示

a,b,c
     //empty line
,,,
a,b,c
有两个有效记录。使用ApacheCommonsCSV解析器,我可以轻松跳过包含空行的记录。但是当记录只包含空值时,如何跳过它呢

为了克服这个问题,我使用了
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
    }
}
有什么内在的方法可以做到这一点吗?或者其他更好的方法?

您可以尝试以下方法:

if (StringUtils.isNotBlank(csvRecord.get(0)) 
     && StringUtils.isNotBlank(csvRecord.get(1)) 
     && StringUtils.isNotBlank(csvRecord.get(2))) {        
   csvContentsList.add(values); 
}
您可以这样尝试:

if (StringUtils.isNotBlank(csvRecord.get(0)) 
     && StringUtils.isNotBlank(csvRecord.get(1)) 
     && StringUtils.isNotBlank(csvRecord.get(2))) {        
   csvContentsList.add(values); 
}

在这里找到另一个可能的解决方案

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
输出

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.
List csvContentsList=csvParser.getRecords()
.stream()
.sequential()//1。
.map((csvRecord)->新字符串[]{
csvRecord.get(0),
csvRecord.get(1),
csvRecord.get(2)
}) // 2.
.filter(v->array.stream(v)
.filter(t->t!=null)
.findFirst()
.isPresent()
) // 3.
.collect(Collectors.toList());//4.
  • 如果行的顺序很重要
  • 将csvRecord映射到字符串[]
  • 对至少有一个非空值的字符串数组进行筛选
  • 收集所有值并返回一个列表

  • 可能需要根据您的要求进行修改。

    在此处找到另一种可能的解决方案

    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
    
    输出

    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.
    
    List csvContentsList=csvParser.getRecords()
    .stream()
    .sequential()//1。
    .map((csvRecord)->新字符串[]{
    csvRecord.get(0),
    csvRecord.get(1),
    csvRecord.get(2)
    }) // 2.
    .filter(v->array.stream(v)
    .filter(t->t!=null)
    .findFirst()
    .isPresent()
    ) // 3.
    .collect(Collectors.toList());//4.
    
  • 如果行的顺序很重要
  • 将csvRecord映射到字符串[]
  • 对至少有一个非空值的字符串数组进行筛选
  • 收集所有值并返回一个列表

  • 可能需要根据您的要求进行修改。

    CSVFormat。默认值
    已包含
    带IgnoreEmptyLines(true)
    。在问题中,我已经提到我可以跳过空行。@Ram我使用流API添加了一个Java 8示例。
    CSVFormat.Default
    已经包含
    带IgnoreEmptyLines(true)
    。在问题中,我已经提到我可以跳过空行。@Ram我添加了一个使用流API的Java 8示例。从哪里获得这个
    StringUtils
    类?这不是ApacheCommons CSV的一部分。请访问此站点下载common lang jar,从何处获取此
    StringUtils
    类?这不是ApacheCommonsCSV的一部分,请访问此站点下载公共语言jar