Datenimport und -export, in einem Enterprise-Software-System so gängig wie das Amen in der Kirche. Auch in meinem jüngsten Projekt war der Import von CSV-Daten eine Anforderung. Nach ein wenig Kopfzerbrechen über verschiedene Bibliotheken (oder doch lieber keine?) gab mein Kollege Jan Weinschenker mir einen Hinweis – SuperCSV. Und wen meine Erfahrungen mit dieser Bibliothek interessieren, der möge doch bitte weiterlesen.
Eingabe
Um keine kundenspezifischen Informationen preiszugeben, werde ich mit fiktiven Daten arbeiten, die aber formattechnisch denen des Kunden entsprechen.
City;Country;Latitude;Longitude;Description Dublin;Ireland;;;"The capital of Ireland. A nice city with lots of pubs." New York;United States;40°43'N;74°00'W;"The first few words on Wikipedia: ""New York is the most populous city in the United States and the center of the New York Metropolitan Area, one of the most populous metropolitan areas in the world.""" Hamburg;Germany;;;The best city in the world.
Die Datei wurde in Excel geschrieben und dann als CSV-Datei gespeichert. Inhaltlich finden wir nur Strings, allerdings mit Zeilenumbruch und/oder Anführungszeichen. Das sind wichtige Kleinigkeiten, die zu berücksichtigen sind, da Benutzer gern mit Zeilenumbrüchen und Zitaten arbeiten und auch arbeiten können sollen.
Verarbeitung
Das Schöne an SuperCSV ist die Mächtigkeit bei gleichzeitiger Einfachheit. Beim Einlesen sollen nicht alle Werte berücksichtig werden, nur die Spalten City, Country und Description sind relevant. Auch die Reihenfolge darf keine Rolle spielen, denn der Benutzer soll sich so wenig Gedanken wie eben möglich um technische Aspekte machen müssen. Die einzige Anforderung, die inhaltlich an die Datei gestellt wird (mal von Formatkonformität abgesehen), ist die, dass Spaltenüberschriften vorhanden sind, mehr nicht.
Und hier ist der gesamte Quelltext, der notwendig ist, um den Inhalt zu einzulesen.
import java.io.FileReader; import java.util.Arrays; import java.util.List; import java.util.Map; import org.supercsv.io.CsvMapReader; import org.supercsv.prefs.CsvPreference; public class SuperCsv { public static void main(String[] args) throws Exception { final String city = "City", country = "Country", description = "Description"; // Use a map reader, to store cell values in a java.util.Map // Also tell SuperCSV to treat the input as a file saved by Excel - out of the box CsvMapReader r = new CsvMapReader(new FileReader("Cities.csv"), CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE); // Read the headers from the first line List<String> presentHeaders = Arrays.asList(r.getCSVHeader(true)); // Check for missing headers List<String> requiredHeaders = Arrays.asList(city, country, description); if (!presentHeaders.containsAll(requiredHeaders)) { throw new Exception("CSV file does not contain all required columns"); } // Ignore unnecessary headers for (int i = 0; i < presentHeaders.size(); ++i) { if (!requiredHeaders.contains(presentHeaders.get(i))) { presentHeaders.set(i, null); } } // Parse the file and print the result Map<String, String> line = null; while ((line = r.read(presentHeaders.toArray(new String[presentHeaders.size()]))) != null) { System.out.println(line); // Do some stuff that makes sense } r.close(); } }
Echt schlank…
Ausgabe
Ein geschultes Auge kann sofort erkennen, dass SuperCSV beim Einlesen Zeichen richtig interpretiert und ggf. entfernt hat. Das Resultat sind saubere Werte.
{Description=The capital of Ireland. A nice city with lots of pubs., Country=Ireland, City=Dublin} {Description=The first few words on Wikipedia: "New York is the most populous city in the United States and the center of the New York Metropolitan Area, one of the most populous metropolitan areas in the world.", Country=United States, City=New York} {Description=The best city in the world., Country=Germany, City=Hamburg}
Fazit
Man möchte fast behaupten, dass der Einbau und das Ausrichten des Steuerelements, das vom Benutzer für den Import betätigt werden soll, komplizierter sind als die Benutzung von SuperCSV. Ich für meinen Teil habe gegenwärtig einen neuen Favoriten für CSV-Handhabung.
Anmerkung: Mein Kollege Jan Galinski hat mir noch den Hinweis gegeben, dass die Lizenz von SuperCSV das Bonbon zur Einfachheit ist. Lizensiert ist es unter der unternehmensfreundlichen Apache License, Version 2.0.