Wie verbinde ich zwei CSV-Dateien?


22

Angenommen, Sie haben eine CSV-Datei mit zwei Feldern: ID und E-Mail. Sie haben eine andere Datei mit 2 Feldern: E-Mail und Name. Wie können Sie eine Datei mit allen drei per E-Mail verbundenen Feldern erstellen?


5
Ein bisschen mehr Details zum Join (dh inner, äußer, links). Ist die E-Mail-Liste in der 1. CSV identisch mit der zweiten Liste? Oder enthält man mehr?
Hyperslug

Beispiele für die CSV-Dateien wären hilfreich, zusammen mit dem Betriebssystem, das Sie verwenden?
Troggy

Ich denke, 1. und 2. Liste sind identisch. Ich benutze Linux. Bitte helfen Sie !!! Vielen Dank!! :)
crst53

1
Wie groß sind die Daten?
Joshua

Antworten:


24

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

Parameter Bedeutung

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

produziert

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

alphabetisch nach E-Mail sortiert.

Beachten Sie, dass E-Mails, die in einer der beiden Dateien fehlen, nicht in den Ergebnissen enthalten sind.


2
CSV ist komplizierter. Das Feldtrennzeichen kann beispielsweise ausgeblendet werden.
Pguardiario

@hyperslug Kann ich einen vollständigen Outer Join durchführen?
Abu Shoeb

Dies funktioniert nicht, wenn die CSV mit oder ohne Anführungszeichen gemischt ist und 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 jedoch, es nicht für ein Skript auf Produktionsebene zu verwenden.
Ondra Žižka

25

Verwenden Sie csvkit :

csvjoin -c email id_email.csv email_name.csv

oder

csvjoin -c 2,1 id_email.csv email_name.csv

4
Warum ist das nicht die beste Antwort?
Alexg

tolles Werkzeug. Sogar erkannt, dass eine meiner Dateien ein anderes Trennzeichen als "," hat.
D_K

6

Vielleicht ist es übertrieben, aber Sie können 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 einfach in die Datenbank übertragen werden.


4

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 vorhanden ist. Ihre einzige Mission ist, dass das Leben aus der Manipulation von Standard-Textdatenbanken mit Trennzeichen besteht. 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 Nutzen / Komplexitäts-Verhältnis als alles andere, was mir bekannt ist.


Perl ist in vielerlei Hinsicht ein Nachfolger von awk.
Reinierpost

awk kümmert sich meines Wissens nicht um Anführungszeichen und Escapezeichen (z. B. Umgang mit, s in einer, getrennten CSV-Datei). Wenn Sie dies benötigen, ist die Verwendung einer dedizierten CSV-Verarbeitungsbibliothek einfacher. Sie existieren für viele Sprachen.
Reinierpost

0

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

Probieren Sie CSV Cruncher .

Es nimmt CSV-Dateien als SQL-Tabellen und lässt dann SQL-Abfragen zu, was zu einer anderen CSV- oder JSON-Datei führt.

Für Ihren Fall rufen Sie einfach an:

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 der Vorteile:

  • Sie erhalten wirklich CSV-Unterstützung, nicht nur "Nehmen wir an, die Daten sind korrekt".
  • Sie können an mehreren Schlüsseln teilnehmen.
  • Einfacher zu bedienen und zu verstehen als joinLösungen auf der Basis von.
  • Sie können mehr als 2 CSV-Dateien kombinieren.
  • Sie können durch SQL-Ausdrücke verbinden - die Werte müssen nicht identisch sein.

Haftungsausschluss: Ich habe dieses Tool geschrieben. Früher war es nach dem Schließen von Google Code nicht mehr in Ordnung, aber ich habe es wiederbelebt und neue Funktionen hinzugefügt, während ich es verwende.


0

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


7
Die Dateierweiterung xlsx impliziert Microsoft Excel, und ich denke, dass VLOOKUP dies auch tut. Diese Frage ist mit Linux getaggt. Gibt es Microsoft Excel für Linux?
Peter Mortensen

Jetzt hat LibreOffice auch VLOOKUP .
Cristian Ciupitu

-1

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

Folgende Operationen werden derzeit unterstützt: Verknüpfen von CSV-Dateien. Es ist möglich, das SQL-Äquivalent der äußeren, inneren, linken und rechten Verknüpfungsoperationen für zwei CSV-Dateien auszuführen. Welche Spalte als Verknüpfungsschlüssel in jeder der Dateien verwendet wird, ist konfigurierbar.


Bitte zitieren Sie die wesentlichen Teile der Antwort aus dem / den Verweis (en), da die Antwort ungültig werden kann, wenn sich die verlinkte (n) Seite (n) ändern.
DavidPostill

Existiert nicht länger.
Ondra Žižka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.