Wie werden zwei CSV-Dateien zusammengefügt?

22065
crst53

Angenommen, Sie haben eine CSV-Datei mit zwei Feldern: ID und E-Mail. Sie haben eine weitere Datei mit 2 Feldern: E-Mail und Name. Wie können Sie eine Datei erstellen, bei der alle drei Felder per E-Mail verbunden sind?

18
Etwas mehr Details zum Join (dh innen, außen, links). Ist die E-Mail-Liste im ersten CSV ** identisch zur zweiten Liste? Oder enthält einer mehr? hyperslug vor 15 Jahren 5
Beispiele für die CSV-Dateien wären praktisch, zusammen mit dem Betriebssystem, das Sie verwenden? Troggy vor 15 Jahren 0
Ich denke die 1. und 2. Liste sind identisch. Ich verwende Linux. Bitte helfen !!! Vielen Dank!! :) crst53 vor 15 Jahren 0
Wie groß sind die Daten? Joshua vor 15 Jahren 1

8 Antworten auf die Frage

23
hyperslug

Revision3 :

Sie müssen beide Listen in E-Mails alphabetisch sortieren und dann beitreten. Vorausgesetzt, dass das E-Mail-Feld das 2. Feld von Datei1 und das 1. Feld von Datei2 ist:

sort -t, -k 2,2 file1.csv > sort1.csv sort -t, -k 1,1 file2.csv > sort2.csv join -t, -1 2 -2 1 sort1.csv sort2.csv > sort3.csv 

Parameterbedeutung

-t,: ',' ist das Feldtrennzeichen -k 2,2: Zeichensortierung im 2. Feld -k 1,1: Zeichensortierung im ersten Feld -1 2: Datei 1, zweites Feld -2 1: Datei 2, erstes Feld >: Ausgabe in Datei 

produziert

E-Mail, ID, Name E-Mail, ID, Name ... 

alphabetisch sortiert per E-Mail.

Wenn eine E-Mail in einer Datei fehlt, wird sie in den Ergebnissen nicht angezeigt.

CSV ist komplizierter. Das Feldtrennzeichen kann beispielsweise mit Escapezeichen versehen werden. pguardiario vor 7 Jahren 1
@Hyperslug Kann ich voll äußere Verbindung machen? Abu Shoeb vor 6 Jahren 0
Dies funktioniert nicht, wenn die CSV in Anführungszeichen / Nicht-Anführungszeichen gemischt wird, wenn die ID ein Komma enthält. Verwenden Sie diese Lösung nur für die einmalige Verarbeitung, bei der Sie das Ergebnis überprüfen. Ich empfehle es jedoch nicht für ein Skript auf Produktionsniveau. Ondra Žižka vor 6 Jahren 0
18
Tgr

Verwenden Sie csvkit :

csvjoin -c email id_email.csv email_name.csv 

oder

csvjoin -c 2,1 id_email.csv email_name.csv 
Warum ist das nicht die beste Antwort? alexg vor 9 Jahren 3
tolles Werkzeug. Sogar erkannt, dass eine meiner Dateien ein anderes Trennzeichen als "," hat. D_K vor 5 Jahren 0
6
Peter Mortensen

Vielleicht ist es übertrieben, aber Sie könnten als zwei Arten von Tabellen in eine Datenbank (z. B. OpenOffice Base) importieren und einen Bericht definieren, der die gewünschte Ausgabe darstellt.

Wenn der CSV-Import ein Problem darstellt, kann ein Tabellenkalkulationsprogramm (z. B. OpenOffice Calc) den Import durchführen. Das Ergebnis kann dann problemlos in die Datenbank übernommen werden.

4
jim in austin

Als zukünftige Referenz möchten Sie vielleicht mit AWK herumspielen . Es ist eine sehr einfache, kleine Skriptsprache, die in irgendeiner Form auf jedem * nix-System existiert, und ihre einzige Aufgabe besteht im Leben in der Manipulation standardisierter Textdatenbanken. Mit ein paar Zeilen Wegwerf-Skript können Sie einige sehr nützliche Dinge tun. Die Sprache ist klein und elegant und hat ein besseres Verhältnis zwischen Nutzen und Komplexität als alles andere, was mir bekannt ist.

Perl ist in vielerlei Hinsicht ein Nachfolger von awk. reinierpost vor 14 Jahren 0
Soweit ich weiß, kann awk nicht mit Zitieren und Escaping umgehen (z. B. mit s in einer, -separierten CSV-Datei umgehen). Wenn Sie dies benötigen, ist die Verwendung einer dedizierten CSV-Bibliothek einfacher. Sie existieren für viele Sprachen. reinierpost vor 14 Jahren 0
0
Janek

Sie können die CSV-Datei mit einem Tabellenkalkulationsprogramm wie LibreOffice lesen und mithilfe des VLOOKUP()Makros nach dem Namen in der zweiten Datei suchen.

Die Dateierweiterung xlsx impliziert Microsoft Excel und ich denke, dass VLOOKUP dies auch tut. Diese Frage ist mit Linux gekennzeichnet. Ist Microsoft Excel für Linux verfügbar? Peter Mortensen vor 13 Jahren 7
Jetzt hat LibreOffice auch [VLOOKUP] (https://help.libreoffice.org/Calc/Spreadsheet_Functions#VLOOKUP). Cristian Ciupitu vor 10 Jahren 0
0
chrislusf

Verwenden Sie Go: https://github.com/chrislusf/gleam

package main  import ( "flag" "os"  "github.com/chrislusf/gleam" "github.com/chrislusf/gleam/source/csv" )  var ( aFile = flag.String("a", "a.csv", "first csv file with 2 fields, the first one being the key") bFile = flag.String("b", "b.csv", "second csv file with 2 fields, the first one being the key") )  func main() {  flag.Parse()  f := gleam.New() a := f.Input(csv.New(*aFile)) b := f.Input(csv.New(*bFile))  a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()  } 
0
Ondra Žižka

Versuchen Sie CSV Cruncher .

Es verwendet CSV-Dateien als SQL-Tabellen und lässt dann SQL-Abfragen zu, wodurch eine weitere CSV- oder JSON-Datei entsteht.

Für Ihren Fall würden Sie einfach anrufen:

crunch -in tableA.csv tableB.csv -out output.csv \ "SELECT tableA.id, tableA.email, tableB.name  FROM tableA LEFT JOIN tableB USING (email)" 

Das Tool benötigt Java 8 oder höher.

Einige Vorteile:

  • Sie erhalten wirklich CSV-Unterstützung, nicht nur "nehmen wir an, dass die Daten korrekt sind".
  • Sie können sich auf mehreren Schlüsseln anmelden.
  • Einfacher zu verwenden und zu verstehen als joinLösungen auf Basis von Lösungen.
  • Sie können mehr als 2 CSV-Dateien kombinieren.
  • Sie können durch SQL-Ausdrücke beitreten - die Werte müssen nicht gleich sein.

Haftungsausschluss: Ich habe dieses Tool geschrieben. Nachdem Google Code geschlossen wurde, war es in Unordnung, aber ich habe es wiederbelebt und neue Funktionen hinzugefügt, wenn ich es verwende.

-1
liket

Sie können auch ein Tool verwenden, das speziell für das Zusammenfügen von CSV-Dateien entwickelt wurde, z. B. das auf https://filerefinery.com

Die Operationen, die wir derzeit unterstützen, sind: Joining von CSV-Dateien. Es ist möglich, das SQL-Äquivalent von äußeren, inneren, linken und rechten Verknüpfungsoperationen für zwei CSV-Dateien auszuführen. Welche Spalte als Verbindungsschlüssel in jeder Datei verwendet wird, ist konfigurierbar.

Bitte zitieren Sie die wesentlichen Teile der Antwort aus den Referenzlinks, da die Antwort ungültig werden kann, wenn sich die verlinkten Seiten ändern. DavidPostill vor 6 Jahren 0
Existiert nicht länger. Ondra Žižka vor 6 Jahren 0