¿Cómo unir dos archivos CSV?

22

Supongamos que tiene un archivo CSV con 2 campos: ID y correo electrónico. Tienes otro archivo con 2 campos: correo electrónico y nombre. ¿Cómo puede producir un archivo con los tres campos unidos en el correo electrónico?

crst53
fuente
55
Un poco más de detalle sobre la unión (es decir, interior, exterior, izquierda). ¿La lista de correo electrónico en el primer CSV es idéntica a la segunda lista? ¿O uno contiene más?
hyperslug
¿Serían útiles los ejemplos de archivos csv, junto con el sistema operativo que está utilizando?
Troggy
Creo que la primera y la segunda lista son idénticas. Estoy usando Linux ¡¡¡Por favor ayuda!!! ¡¡Gracias!! :)
crst53
1
¿Qué tan grandes son los datos?
Joshua

Respuestas:

24

Revisión3 :

Debe ordenar alfabéticamente ambas listas en el correo electrónico y luego unirse. Dado que el campo de correo electrónico es el segundo campo del archivo1 y el primer campo del archivo2:

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

significado del parámetro

-t,: ',' es el separador de campo
-k 2,2: clasificación de caracteres en el segundo campo
-k 1,1: clasificación de caracteres en el primer campo
-1 2: archivo 1, segundo campo
-2 1: archivo 2, primer campo
>: salida a archivo

produce

correo electrónico, ID, nombre
correo electrónico, ID, nombre
...

ordenado por correo electrónico alfabéticamente.

Tenga en cuenta que si falta algún correo electrónico en cualquiera de los archivos, se omitirá de los resultados.

hiperslug
fuente
2
CSV es más complicado que esto. El separador de campo se puede escapar, por ejemplo.
pguardiario
@hyperslug ¿puedo hacer una unión externa completa?
Abu Shoeb
Esto no funcionará si el CSV se combina con comillas / sin comillas, si la ID contiene una coma. Use esta solución solo para el procesamiento de una sola vez donde verifique el resultado. Pero recomiendo no usarlo para un script de nivel de producción.
Ondra Žižka
25

Use csvkit :

csvjoin -c email id_email.csv email_name.csv

o

csvjoin -c 2,1 id_email.csv email_name.csv
Tgr
fuente
44
¿Por qué no es esta la mejor respuesta?
alexg
herramienta asombrosa Incluso reconoció que uno de mis archivos tiene un delimitador diferente a ",".
D_K
6

Quizás sea excesivo, pero podría importar a una base de datos (por ejemplo, OpenOffice Base) como dos tipos de tablas y definir un informe que sea el resultado deseado.

Si la importación de CSV es un problema, entonces un programa de hoja de cálculo (por ejemplo, OpenOffice Calc) puede realizar la importación. El resultado se puede transferir fácilmente a la base de datos.

Peter Mortensen
fuente
4

Como referencia futura, es posible que desee comenzar a jugar con AWK . Es un lenguaje de scripting muy simple que existe de alguna forma en todos los sistemas * nix y su única misión es la vida es la manipulación de bases de datos textuales delimitadas estándar. Con unas pocas líneas de script desechable, puede hacer algunas cosas muy útiles. El lenguaje es pequeño y elegante y tiene una mejor relación utilidad / complejidad que cualquier otra cosa que conozco.

jim en austin
fuente
Perl es en muchos sentidos un sucesor de awk.
reinierpost
awk no maneja las citas y los escapes (por ejemplo, tratar con, s en un archivo CSV separado) hasta donde yo sé. Si lo necesita, usar una biblioteca de manejo de CSV dedicado es más fácil; existen para muchos idiomas.
reinierpost
0

Use Ir: 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
fuente
0

Prueba CSV Cruncher .

Toma archivos CSV como tablas SQL y luego permite consultas SQL, lo que resulta en otro archivo CSV o JSON.

Para su caso, simplemente llame:

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

La herramienta necesita Java 8 o posterior.

Algunas de las ventajas:

  • Realmente obtienes soporte CSV, no solo "supongamos que los datos son correctos".
  • Puedes unirte en múltiples teclas.
  • Más fácil de usar y comprender que las joinsoluciones basadas.
  • Puede combinar más de 2 archivos CSV.
  • Puede unirse mediante expresiones SQL: los valores no tienen que ser los mismos.

Descargo de responsabilidad: escribí esa herramienta. Solía ​​estar en desorden después de que Google Code se cerró, pero lo reviví y agregué nuevas funciones a medida que lo uso.

Ondra Žižka
fuente
0

Puede leer el archivo CSV con un programa de hoja de cálculo como LibreOffice y usar VLOOKUP()macro para buscar el nombre en el segundo archivo.

Janek
fuente
77
La extensión de archivo xlsx implica Microsoft Excel y creo que VLOOKUP también lo hace. Esta pregunta está etiquetada con Linux. ¿Microsoft Excel está disponible para Linux?
Peter Mortensen
Ahora LibreOffice también tiene BUSCARV .
Cristian Ciupitu
-1

También puede usar una herramienta diseñada específicamente para unir archivos csv, como la que se encuentra en https://filerefinery.com

Las operaciones que actualmente admitimos son: Unir archivos csv. Es posible realizar el equivalente SQL de las operaciones de unión externas, internas, izquierda y derecha en dos archivos csv. La columna que se utilizará como clave de combinación en cada uno de los archivos es configurable.

gustar
fuente
Cite las partes esenciales de la respuesta de los enlaces de referencia, ya que la respuesta puede volverse inválida si las páginas enlazadas cambian.
DavidPostill
Ya no existe.
Ondra Žižka