CSV Datei für Import aufbereiten


MadeP

Grünschnabel
Hallo Leute,

ich stehe vor folgendem Problem:
ich möchte Daten von einem System in ein anderes System übertragen. Dies soll mit einem Import/Export im .csv-Format geschehen.
Da diese Übertragung demnächst alle 2-3 Tage durchgeführt werden muss, sollen die Daten hierfür automatisch angepasst werden.
Zum einen müssen die Spaltenüberschriften geändert werden, da diese nicht kompatibel sind. Außerdem kommt es vor, dass z.B. aus zwei Spalten eine Spalte gemacht werden muss (z.B. aus den Spalten "Farben" mit dem Wert "Grün" und "Größe" mit dem Wert "Mittel" wird die Spalte "Variante" mit dem Wert "Grün & Mittel".

Da ich lediglich zurzeit mich etwas in Java auskenne hatte ich gedacht schreibe ich hierfür ein Script, das dieses erledigt.
Hierfür wollte ich die Apache Commons CSV Library nutzen. Ich bekomme die Test-Datei auch eingelsen, jedoch bekomme ich die Werte nicht in eine neue CSV-Datei.
Außerdem weiß ich nicht genau wie ich die Werte der Spalten nun bearbeiten könnte.

Falls es einen einfacheren Weg gibt CSV-Datei automatisch so aufbereiten zu lassen bin ich ebenfalls für alles offen. Mir kam dies nur als erstes in den Sinn.
Über einen Tipp würde ich mich freuen.
Btw es handelt sich letztendlich um ca. 5000 Datensätze mit ca. 30 Spalten/Attributen.

Mein Code der das Einlesen und Erstellen einer CSV testen soll sieht zurzeit wie folgt aus:
Java:
import java.io.*;
import org.apache.commons.csv.*;

public class read {
    private static final String CSV_FILEIN = "test_in.csv";
    private static final String CSV_FILEOUT = "test_out.csv";
    private static final String[] HEADER = { "Nummer", "Bezeichnung" };

    public static void main(String[] args) throws IOException {
      
        //READ
        Reader reader = new FileReader(CSV_FILEIN);
        CSVParser parser = new CSVParser(reader,
                CSVFormat.EXCEL.withDelimiter(';').withHeader(HEADER).withSkipHeaderRecord());
        for (CSVRecord record : parser) {
            System.out.print(record.get("Nummer"));
            System.out.println(record.get("Bezeichnung"));
        }
      
        //WRITE
        Writer out=new FileWriter(CSV_FILEOUT);
        CSVPrinter printer=new CSVPrinter(out, CSVFormat.DEFAULT.withHeader(HEADER));
        printer.print(parser);
    }
}
}
 

Sempervivum

Erfahrenes Mitglied
Java ist sicher eine Option, aber weil ich gerade mit Powershell begonnen habe, habe ich damit mal eine Demo mit wenigen Zeilen implementiert:
Code:
$indata = Import-Csv -Path '.\testin.csv' -Delimiter ';'
$outdata = @()
$indata.foreach( {
        Write-Host $_.Vorname $_.Name $_.Größe $_.Farbe
        $outobj = New-Object PSObject -Property @{
            Name     = ($_.Vorname + ' ' + $_.Name)
            Variante = ($_.Größe + '&' + $_.Farbe)
        }
        $outdata += $outobj
    })

$outdata | Export-Csv -path ".\testout.csv"  -Encoding UTF8 -Delimiter ';' -notypeinformation
Read-Host -Prompt "Press Enter to exit"
testin.csv:
Code:
Name;Vorname;Farbe;Größe
Bangert;Ulrich;Grün;Mittel
Muster;Max;Blau;Klein
Das Skript fügt Vorname und Name sowie Größe und Farbe zusammen, so dass die Ausgabe so aussieht:
Code:
"Variante";"Name"
"Mittel&Grün";"Ulrich Bangert"
"Klein&Blau";"Max Muster"
 

Technipion

Erfahrenes Mitglied
Hallo MadeP,
ich sehe du liest die CSV Datei so ein:
Java:
        CSVParser parser = new CSVParser(reader,
                CSVFormat.EXCEL.withDelimiter(';').withHeader(HEADER).withSkipHeaderRecord());
Und schreibst sie aber so:
Java:
        CSVPrinter printer=new CSVPrinter(out, CSVFormat.DEFAULT.withHeader(HEADER));
Daher zunächst die Frage: Warum benutzt du Semikolon (";") als Delimiter? Sind das französische Excel-Dateien?
Dann direkt im Anschluss: Warum schreibst du die CSV-Datei danach im DEFAULT-Format? Willst du das Format nicht beibehalten?

Gruß Technipion
 

MadeP

Grünschnabel
@Sempervivum Eventuell ist Powershell auch die bessere Lösung. Ich werde mich mal dran setzen und versuchen das ganze in der Powershell umzusetzen. Dein Beispiel-Code hilft mir aufjedenfall schon mal sehr! Danke!

@Technipion Ja, du hast recht. Die Ursprungs-Datei ist tatsächlich in einem französischen Format. Lässt sich aber auch zur Not ändern. Das wäre nicht das Problem. Ob die Ausgabedatei wieder das gleiche Format hat oder nicht, ist für den Import ziemlich egal, da man hier ebenfalls den Delimiter angeben muss.