2016-04-19 4 views
0

zu überspringen, wenn eine CSV-Datei drei Spalten enthält und wenn die Werte wie unten angegeben sindUm leere Datensätze aus einer CSV-Datei mit Apache Commons CSV

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

Es gibt zwei gültige Datensätze. Mit dem CSV-Parser von Apache Commons konnte ich den Datensatz, der leere Zeilen enthält, einfach überspringen. Aber wenn die Datensätze nur Nullwerte enthalten, wie kann man sie dann überspringen?

Um dies zu überwinden, verwende ich Stringequals() mit bereits konstruierten leeren Datensatz. Hier ist eine Beispielimplementierung.

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

Wenn ich die Linie nicht verwenden als ‚linea‘ markiert, gibt diese Implementierung drei Datensätze in den csvContentsList wie unten

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

Gibt es eine eingebaute Möglichkeit, dies zu tun? oder ein anderer besserer Weg?

Antwort

1

finden Sie hier eine andere mögliche Lösung.

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 Eingang

a,b,c 

,,, 
d,e,f 

Ausgang

a,b,c 
d,e,f 

bearbeiten Wenn Sie Java 8 eine Lösung sein könnte, verwenden können.

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. wenn die Reihenfolge der Leitungen wichtig ist
  2. eine csvRecord in einen String Map []
  3. Filter auf String-Arrays mit mindestens einem nicht-NULL-Wert
  4. sammeln alle Werte und Rückkehr a Liste

Möglicherweise müssen geändert werden, je nach Ihren Anforderungen.

+1

'CSVFormat.Default' enthält bereits' withIgnoreEmptyLines (true) '. https://commons.apache.org/proper/commons-csv/apidocs/org/apache/commons/csv/CSVFormat.html#DEFAULT. Und in der Frage habe ich bereits erwähnt, dass ich Leerzeilen überspringen kann. – Ram

+0

@Ram Ich habe ein Java 8-Beispiel mit der Stream-API hinzugefügt. – SubOptimal

1

könnten Sie versuchen StringUtils#isNotBlank() auf diese Weise:

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

Woher bekommen Sie diese 'StringUtils' Klasse? Es ist nicht Teil "Apache commons CSV". – Ram

+0

@Ram besuchen Sie diese Seite zum Download der allgemeinen Sprache jar https://commons.apache.org/proper/commons-lang/download_lang.cgi –

Verwandte Themen