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?
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?
Risposte:
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.
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.
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.
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()
}
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:
join
soluzioni basate su.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.
È 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.
È 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.