Wie lassen sich comma separated values (csv) in ein numerisches Array wandeln?

CSV-Dateien (comma separated values) sind Text-Dateien, die Werte enthalten, die durch Kommata oder ein anderes Zeichen voneinander getrennt sind. In diesem Beispiel wird lediglich ein sehr einfacher Ansatz gezeigt, wie ein solcher Text in ein numerisches (etwa int-) Array überführt werden kann. Zum Parsen komplexer CSV-Dateien ist er aus vielerlei Gründen in der Form jedoch nicht geeignet und müsste erheblich erweitert werden.

Das Beispiel geht von einem String aus, der aus positiven und negativen numerischen Werten besteht, die durch Kommata getrennt sind. Zur Demonstration eines entsprechenden Fehlerverhaltens sind zudem ein alphanumerischer und ein leerer Wert (zwei aufeinander folgende Kommata) eingetragen.

Durch die Methode String.split() wird der Werte-String zunächst in ein String-Array eingelesen. Als Trenner fungiert hier das Komma. Nach Erzeugen eines gleichgroßen int-Arrays wird das String-Array nun in einer Schleife durchlaufen und die einzelnen Werte zunächst durch die Methode String.trim() von führenden und nachfolgenden Leerzeichen bereinigt.
In der Folge wird über einen regulären Ausdruck geprüft, ob es sich bei dem jeweiligen Wert um eine beliebig große positive oder negative Zahl handelt.
Ist dies der Fall, so wird der numerische Wert des Strings der identischen Position im int-Array zugewiesen. Dies geschieht über die Bildung eines entsprechenden Integer-Objektes. Es wird schließlich in den primitiven int-Wert gecastet.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CsvToArray {
    private static final String TRENNER = ",";

    public static void main(String[] args) {
        String s = "14,abc,+68,1024,-109,  ,17";
        String[] sa = s.split(TRENNER);
        int[] ia = new int[sa.length];
        for (int i = 0; i < sa.length; i++) {
            sa[i] = sa[i].trim();
            if (sa[i].matches("[-|+]?[0-9]{1,}")) {
                try {
                    ia[i] = new Integer(sa[i]).intValue();
                } catch (NumberFormatException nfe) {
                }
            }
        }
        for(int i : ia) {
            System.out.println(i);
        }
    }
}

Obwohl die Verarbeitung von unerlaubten Werten durch den regulären Ausdruck ausgeschlossen wird, sollte das Casting durch einen try-catch-Block abgesichert werden.
Im Beispiel werden die Positionen des leeren Wertes und des alphanumerischen Eintrags durch split(), bzw. durch den regulären Ausdruck ausgefiltert und führen so zu einer Leerposition im int-Array. Sie enthalten nach Beendigung der Schleife den Standardwert 0.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.