¿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?


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.


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

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.


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.


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

}

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.


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.