In CSV A einen Eintrag aus CSV B abrufen
Samuel fiedler
- csv
- perl
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
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
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
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
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
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
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
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.