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.