Comment joindre deux fichiers CSV?

22

Supposons que vous ayez un fichier CSV avec 2 champs: ID et email. Vous avez un autre fichier avec 2 champs: email et nom. Comment pouvez-vous produire un fichier avec les trois champs joints par e-mail?

crst53
la source
5
Un peu plus de détails sur la jointure (c'est-à-dire intérieure, extérieure, gauche). La liste de diffusion sur le 1er CSV est-elle identique à la deuxième liste? Ou en contient-on plus?
hyperslug
Des exemples de fichiers csv seraient utiles, avec le système d'exploitation que vous utilisez?
Troggy
je pense que la 1ère et la 2ème liste sont identiques. J'utilise Linux. Aidez-moi !!! Merci!! :)
crst53
1
quelle est la taille des données?
Joshua

Réponses:

24

Révision3 :

Vous devez trier les deux listes par e-mail par ordre alphabétique, puis rejoindre. Étant donné que le champ email le 2ème champ du fichier1 et le 1er champ du fichier2:

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

signification du paramètre

-t,: ',' est le séparateur de champ
-k 2,2: tri des caractères sur le 2ème champ
-k 1,1: tri des caractères sur le 1er champ
-1 2: fichier 1, 2ème champ
-2 1: fichier 2, 1er champ
>: sortie dans un fichier

produit

email, ID, nom
email, ID, nom
...

triés par e-mail par ordre alphabétique.

Notez que si un e-mail manque dans l'un ou l'autre des fichiers, il sera omis des résultats.

hyperslug
la source
2
CSV est plus compliqué que cela. Le séparateur de champ peut être échappé par exemple.
pguardiario
@hyperslug puis-je faire une jointure externe complète?
Abu Shoeb
Cela ne fonctionnera pas si le CSV est mélangé entre guillemets / non cotés, si l'ID contient une virgule. Utilisez cette solution uniquement pour un traitement unique où vous vérifiez le résultat. Mais je recommande de ne pas l'utiliser pour un script de niveau production.
Ondra Žižka
25

Utilisez csvkit :

csvjoin -c email id_email.csv email_name.csv

ou

csvjoin -c 2,1 id_email.csv email_name.csv
Tgr
la source
4
Pourquoi n'est-ce pas la meilleure réponse?
alexg
outil génial. Même reconnu, que l'un de mes fichiers a un délimiteur différent de ",".
D_K
6

C'est peut-être exagéré, mais vous pouvez importer dans une base de données (par exemple OpenOffice Base) sous deux types de tables et définir un rapport qui est la sortie souhaitée.

Si l'importation CSV pose problème, un tableur (par exemple OpenOffice Calc) peut effectuer l'importation. Le résultat peut ensuite être facilement transféré dans la base de données.

Peter Mortensen
la source
4

Comme référence future, vous voudrez peut-être commencer à jouer avec AWK . C'est un petit langage de script très simple qui existe sous une forme quelconque sur chaque système * nix et sa seule mission est la vie est la manipulation de bases de données textuelles délimitées standard. Avec quelques lignes de script jetable, vous pouvez faire des choses très utiles. Le langage est petit et élégant et a un meilleur rapport utilité / complexité que tout ce que je connais.

Jim à Austin
la source
Perl est à bien des égards un successeur de awk.
reinierpost
awk ne gère pas les citations et les échappements (par exemple, traiter les s dans un fichier CSV séparé) pour autant que je sache. Si vous en avez besoin, l'utilisation d'une bibliothèque de gestion CSV dédiée est plus facile; ils existent pour de nombreuses langues.
reinierpost
0

Utilisez 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()

}
chrislusf
la source
0

Essayez CSV Cruncher .

Il prend les fichiers CSV en tant que tables SQL, puis autorise les requêtes SQL, résultant en un autre fichier CSV ou JSON.

Pour votre cas, vous appelez simplement:

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

L'outil nécessite Java 8 ou une version ultérieure.

Quelques avantages:

  • Vous obtenez vraiment le support CSV, pas seulement "supposons que les données soient correctes".
  • Vous pouvez rejoindre sur plusieurs clés.
  • Plus facile à utiliser et à comprendre que les joinsolutions basées sur.
  • Vous pouvez combiner plus de 2 fichiers CSV.
  • Vous pouvez joindre par des expressions SQL - les valeurs ne doivent pas nécessairement être les mêmes.

Avertissement: j'ai écrit cet outil. Il était en déroute après la fermeture de Google Code, mais je l'ai réactivé et ajouté de nouvelles fonctionnalités au fur et à mesure que je l'utilise.

Ondra Žižka
la source
0

Vous pouvez lire le fichier CSV avec un tableur comme LibreOffice et utiliser une VLOOKUP()macro pour rechercher le nom dans le deuxième fichier.

Janek
la source
7
L'extension de fichier xlsx implique Microsoft Excel et je pense que VLOOKUP le fait aussi. Cette question est balisée avec Linux. Microsoft Excel est-il disponible pour Linux?
Peter Mortensen
Maintenant LibreOffice a aussi VLOOKUP .
Cristian Ciupitu
-1

Vous pouvez également utiliser un outil spécialement conçu pour joindre des fichiers csv, tel que celui trouvé sur https://filerefinery.com

Les opérations que nous prenons en charge actuellement sont les suivantes: Joindre des fichiers csv. Il est possible d'effectuer l'équivalent SQL des opérations de jointure externe, interne, gauche et droite sur deux fichiers csv. La colonne qui sera utilisée comme clé de jointure dans chacun des fichiers est configurable.

liket
la source
Veuillez citer les parties essentielles de la réponse à partir du ou des liens de référence, car la réponse peut devenir invalide si la ou les pages liées changent.
DavidPostill
N'existe plus.
Ondra Žižka