2016-04-19 34 views
0

一個CSV文件跳過空記錄,如果CSV文件包含三列,如果值低於要使用Apache共享CSV

a,b,c 
    //empty line 
,,, 
a,b,c 

給出有兩種有效的記錄。使用Apache commons CSV解析器,我可以輕鬆地跳過空行的記錄。但是當記錄只包含空值時,如何跳過它呢?

爲了克服這個問題,我使用Stringequals()與已經構建的空記錄。這是一個示例實現。

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] 

有什麼內在的方式做到這一點?或者其他更好的方法?

回答

1

在這裏找到另一種可能的解決方案。

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

assumend輸入

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. 收集所有的值和返回列表

可能需要根據您的要求進行修改。

+1

'CSVFormat.Default'已經包含'withIgnoreEmptyLines(true)'。 https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVFormat.html#DEFAULT。在問題中,我已經提到我可以跳過空行。 – Ram

+0

@Ram我使用Stream API添加了一個Java 8示例。 – SubOptimal

1

你可以試試StringUtils#isNotBlank()這樣:

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

從哪裏得到這個'StringUtils'類?它不是'Apache commons CSV'的一部分。 – Ram

+0

@Ram訪問此網站以下載常用的lang jar https://commons.apache.org/proper/commons-lang/download_lang.cgi –