Samuel fiedler: In CSV A einen Eintrag aus CSV B abrufen

Hallo an alle!

Nun habe ich mich recht gut in Perl eingelesen und jetzt habe ich gerade mal wieder ein kleines Problemchen.
Ich verarbeite zwei große CSV-Dateien. Eine davon hat nur Nummern für die Spezifikation von Artikeln, die andere hat für die Nummern den jeweiligen Pfad.
Wie bekomme ich jetzt aus der großen Menge des Namens-CSV die richtigen Daten?

Beispiel:

daten.csv (als Tabelle dargestellt)

Nummer Inhalt
001 TEST
002 TEST TEST
005 TEST TEST TEST
010 TEST TEST TEST TEST

adressen.csv (als Tabelle dargestellt)

Nummer Adresse
001 test/text.txt
005 viel_mehr/toll.txt
002 sonstiges/index.txt
010 am_meisten/gross.txt

Jetzt möchte ich z.B. für Nummer 5 den richtigen Pfad öffnen und in diesen dann schreiben.

Au revoir Bonjour,
Samuel Fiedler

  1. Hi,

    Nun habe ich mich recht gut in Perl eingelesen und jetzt habe ich gerade mal wieder ein kleines Problemchen.
    Ich verarbeite zwei große CSV-Dateien. Eine davon hat nur Nummern für die Spezifikation von Artikeln, die andere hat für die Nummern den jeweiligen Pfad.
    Wie bekomme ich jetzt aus der großen Menge des Namens-CSV die richtigen Daten?

    die zweite CSV in eine Map (bei Perl heißt's IIRC Hash) einlesen (key ist die Nummer, value die "Adresse")

    Dann kannst Du direkt aus der Map die Adresse zur Nummer aus der ersten CSV holen.

    cu,
    Andreas a/k/a MudGuard

  2. Hallo Samuel,

    Nun habe ich mich recht gut in Perl eingelesen

    ich mag mich irren, aber meine persönliche Wahrnehmung ist die, dass Perl schon seit Jahren nur noch von ein paar Enthusiasten für Nischenprobleme genutzt wird, aber insgesamt so langsam vor sich hin stirbt.

    Wenn du dich dafür begeistern magst - bitte, gern. Aber sei gewarnt, dass die Anhängerschaft relativ klein ist.

    Immer eine Handbreit Wasser unterm Kiel
     Martin

    --
    Wenn ich den See seh, brauch ich kein Meer mehr.
  3. Hallo Samuel,

    das ist kein Perl-Problem, sondern eins der verwendeten Datenhaltung.

    Lösung 1: Wenn die Dateien klein genug sind (unter 100MB), saug sie in den Speicher. Die von Andreas erwähnte Hashmap ist ideal, um zu einem Schlüssel schnell einen Wert zu finden.

    Lösung 2: Wenn es nicht in den Speicher passt, könnte man die CSV Datei in eine Datenbank importieren.

    Lösung 3: Beide Dateien nach der Nummer sortieren (was bei CSV und Zahlen variabler Länge wenig trivial sein kann) und einen Dateiabgleich programmieren, um sie in einer Datei zusammenzuführen. Ich hab sowas noch lernen müssen (1985), heute findet Google nichts mehr dazu 😕

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf B!

      Lösung 1: Wenn die Dateien klein genug sind (unter 100MB), saug sie in den Speicher. Die von Andreas erwähnte Hashmap ist ideal, um zu einem Schlüssel schnell einen Wert zu finden.

      Ja, sie sind klein genug (die eine 16 MB und die andere 1 MB).
      Es gibt an der Hashmap ein kleines Problemchen:
      Ich möchte nur diese beiden Informationen haben. Das sind aber nur 2 von 13 Elementen.
      Das werde ich aber etwas unsauber mit eval lösen (eval "($NUMMER => \"$ADRESSE\")")

      Lösung 2: Wenn es nicht in den Speicher passt, könnte man die CSV Datei in eine Datenbank importieren.

      Es passt in den Speicher, aber ich habe die CSV-Dateien aus einer Datenbank exportiert 😉.

      Au revoir,
      Samuel Fiedler

      1. Hallo Samuel,

        Das werde ich aber etwas unsauber mit eval lösen

        Ich bin keine Perlentaucher und weiß nicht, wie schmutzig und widerlich ein eval in Perl ist. Vermutlich nicht schmutziger und widerlicher als Perl selbst 😉. Wenn es keinen eleganteren Weg gibt, aus einer CSV Zeile einen Eintrag in einer Hashmap zu erzeugen - dann ist das so. Aber ich würde fest glauben, es geht eleganter. Ich habe nur keine Ahnung von Perl.

        Rolf

        --
        sumpsi - posui - obstruxi
      2. Hallo,

        Lösung 2: Wenn es nicht in den Speicher passt, könnte man die CSV Datei in eine Datenbank importieren.

        Es passt in den Speicher, aber ich habe die CSV-Dateien aus einer Datenbank exportiert 😉.

        dann würde es sich aber doch anbieten, das Zusammenführen direkt in der DB vor dem Export zu machen.

        Immer eine Handbreit Wasser unterm Kiel
         Martin

        --
        Wenn ich den See seh, brauch ich kein Meer mehr.
  4. Das kommt jetzt ein wenig darauf an, was Du wirklich willst.

    Also, was uns zeigst ist ein „Join“. Willst Du …

    A) Ein effektives Programm schreiben?

    Mach den Join z.B. als natural join schon bei der Datenbankabfrage mit SQL:

    SELECT 
        daten.Inhalt,
        adressen.Adresse
    FROM
        daten,
        adressen
    WHERE
        daten.NUMMER = adressen.NUMMER;
    

    Notiere, dass Datenbanken so etwas am effektivsten können und nicht als reine Datenspeicher unterfordert und missachtet werden sollten. Und beantworte Dir die Frage von Martin, ob es anno 2022 Perl sein muss.

    B) Wegen widriger Umstände ein effektives Programm „par tout“ in Perl schreiben, welches „par tout“ die Daten aus den Textdateien benutzt?

    Du kannst Du (aus Effektivitätsgründen) den Join mit dem Unix/Linux-Programm join machen:

    man 1 join, Beispiel: https://shapeshed.com/unix-join/

    Oder C) Perl lernen?

    Dann schau Dir dieses Beispiel an:

    https://rubysash.com/programming/perl/join-similar-csv-using-perl/

    Mit „Join CSV Perl“ wirst Du weitere finden.