2016-04-19 32 views
0

を使用してCSVファイルから空のレコードをスキップし、は、Apache CommonsのCSV

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

以下に示すような値がある場合、2つの有効なレコードがあります。 Apache Commons CSVパーサーを使用すると、空の行を持つレコードを簡単にスキップできます。しかし、レコードにnull値のみが含まれている場合、それをスキップする方法はありますか?

これを解決するために、私は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 
    } 
} 

i「はリネア」としてマークされた行を使用しない場合は、この実装は

[a,b,c] 
[null,null,null] 
[a,b,c] 

以下のようcsvContentsListに3つのレコードを与え、これを行うための任意の作り付けの方法はありますか?または他のより良い方法?

答えて

1

は、ここでは別の可能な解決策を探します。あなたは、Java 8を使用することができる場合

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 

編集ソリューションがあるかもしれません。

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. は、少なくとも一つの非ヌル値
  3. と文字列に文字列[]
  4. フィルタにcsvRecordをマップのすべての値およびリターンを集めますリスト

要件に応じて、修正する必要がある場合があります。

+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 –