Come unire due file CSV?


22

Supponiamo di avere un file CSV con 2 campi: ID ed e-mail. Hai un altro file con 2 campi: email e nome. Come è possibile produrre un file con tutti e tre i campi uniti tramite e-mail?


5
Un po 'più di dettaglio sul join (cioè interno, esterno, sinistro). L'elenco e-mail sul primo CSV è identico al secondo elenco? O ne contiene di più?
hyperslug,

Esempi di file CSV sarebbero utili, insieme al sistema operativo in uso?
Troggy

penso che il 1 ° e il 2 ° elenco siano identici. Sto usando Linux. Per favore aiuto!!! Grazie!! :)
crst53,

1
quanto sono grandi i dati?
Giosuè,

Risposte:


24

Revisione 3 :

È necessario ordinare entrambi gli elenchi via e-mail in ordine alfabetico, quindi unire. Dato che il campo email è il 2 ° campo di file1 e il 1 ° campo di file2:

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

significato del parametro

-t,: ',' è il separatore di campo
-k 2,2: ordinamento dei caratteri sul secondo campo
-k 1,1: ordinamento dei caratteri sul 1 ° campo
-1 2: file 1, 2 ° campo
-2 1: file 2, primo campo
>: output su file

produce

e-mail, ID, nome
e-mail, ID, nome
...

ordinati per e-mail in ordine alfabetico.

Nota che se manca un'e-mail da uno dei file, questa verrà omessa dai risultati.


2
CSV è più complicato di così. Il separatore di campo può essere sfuggito, ad esempio.
pguardiario,

@hyperslug posso eseguire un join esterno completo?
Abu Shoeb,

Questo non funzionerà se il CSV è misto quotato / non quotato, se l'ID contiene una virgola. Utilizzare questa soluzione solo per l'elaborazione singola in cui si controlla il risultato. Ma consiglio di non usarlo per uno script a livello di produzione.
Ondra Žižka,

25

Usa csvkit :

csvjoin -c email id_email.csv email_name.csv

o

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

4
Perché questa non è la risposta migliore?
alexg

strumento fantastico. Anche riconosciuto, che uno dei miei file ha un delimitatore diverso da ",".
D_K,

6

Forse è eccessivo, ma è possibile importare in un database (ad esempio OpenOffice Base) come due tipi di tabelle e definire un report che è l'output desiderato.

Se l'importazione CSV è un problema, allora un programma di foglio di calcolo (ad esempio OpenOffice Calc) può eseguire l'importazione. Il risultato può quindi essere facilmente trasferito nel database.


4

Come riferimento futuro potresti voler iniziare a giocare con AWK . È un linguaggio di scripting molto semplice che esiste in qualche forma su ogni sistema * nix e la sua unica missione è che la vita sia la manipolazione di database testuali delimitati standard. Con poche righe di script usa e getta puoi fare alcune cose molto utili. Il linguaggio è piccolo ed elegante e ha un rapporto utilità / complessità migliore rispetto a qualsiasi altra cosa di cui io sia a conoscenza.


Perl è in molti modi un successore di awk.
reinierpost,

awk non gestisce le quotazioni e l'escaping (ad esempio, trattare con, s in un file CSV separato), per quanto ne so. Se necessario, è più semplice utilizzare una libreria di gestione CSV dedicata; esistono per molte lingue.
reinierpost,

0

Usa 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

Prova CSV Cruncher .

Prende i file CSV come tabelle SQL e quindi consente le query SQL, risultando in un altro file CSV o JSON.

Per il tuo caso, chiameresti semplicemente:

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

Lo strumento richiede Java 8 o versioni successive.

Alcuni dei vantaggi:

  • Ottieni davvero il supporto CSV, non solo "supponiamo che i dati siano corretti".
  • Puoi unirti su più chiavi.
  • Più facile da usare e capire di joinsoluzioni basate su.
  • Puoi combinare più di 2 file CSV.
  • È possibile unire espressioni SQL: i valori non devono essere gli stessi.

Disclaimer: ho scritto quello strumento. Un tempo era in disordine dopo la chiusura di Google Code, ma l'ho rianimato e ho aggiunto nuove funzionalità mentre lo utilizzo.


0

È possibile leggere il file CSV con un programma per fogli di calcolo come LibreOffice e utilizzare la VLOOKUP()macro per cercare il nome nel secondo file.


7
L'estensione del file xlsx implica Microsoft Excel e penso anche VLOOKUP. Questa domanda è taggata con Linux. Microsoft Excel è disponibile per Linux?
Peter Mortensen,

Ora LibreOffice ha anche VLOOKUP .
Cristian Ciupitu,

-1

È inoltre possibile utilizzare uno strumento appositamente progettato per unire file CSV, come quello che si trova su https://filerefinery.com

Le operazioni attualmente supportate sono: Unire file CSV. È possibile eseguire l'equivalente SQL delle operazioni di join esterno, interno, sinistro e destro su due file CSV. Quale colonna verrà utilizzata come chiave di join in ciascuno dei file è configurabile.


Si prega di citare le parti essenziali della risposta dai collegamenti di riferimento, in quanto la risposta può diventare non valida se le pagine collegate cambiano.
DavidPostill

Non esiste più.
Ondra Žižka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.