Blog

Immer wieder CSVs

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.

Holisticon AG — Teile diesen Artikel

Über den Autor

Antwort hinterlassen