Bagaimana cara menggabungkan dua file CSV?


22

Misalkan Anda memiliki satu file CSV dengan 2 bidang: ID dan email. Anda memiliki file lain dengan 2 bidang: email dan nama. Bagaimana Anda bisa menghasilkan file dengan ketiga bidang digabung pada email?


5
Sedikit lebih detail pada sambungan (yaitu, dalam, luar, kiri). Apakah daftar email pada CSV 1 identik dengan daftar kedua? Atau apakah seseorang mengandung lebih banyak?
hyperslug

Contoh file csv akan berguna, bersama dengan OS yang Anda gunakan?
Troggy

saya pikir daftar 1 dan 2 identik. Saya menggunakan Linux. Tolong bantu!!! Terima kasih!! :)
crst53

1
seberapa besar data?
Joshua

Jawaban:


24

Revisi3 :

Anda harus mengurutkan kedua daftar di email sesuai abjad, lalu bergabung. Mengingat bahwa bidang email bidang ke-2 file1 dan bidang ke-1 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

makna parameter

-t,: ',' adalah pemisah bidang
-k 2,2: sort karakter pada bidang ke-2
-k 1,1: pengurutan karakter pada bidang 1
-1 2: file 1, bidang ke-2
-2 1: file 2, bidang 1
>: output ke file

menghasilkan

email, ID, nama
email, ID, nama
...

disortir berdasarkan email berdasarkan abjad.

Perhatikan bahwa jika ada email yang hilang dari salah satu file itu akan dihilangkan dari hasil.


2
CSV lebih rumit dari ini. Pemisah bidang dapat diloloskan misalnya.
pguardiario

@ hyperslug dapatkah saya melakukan penggabungan penuh di luar?
Abu Shoeb

Ini tidak akan berfungsi jika CSV dicampur dikutip / tidak diturunkan, jika ID berisi koma. Gunakan solusi ini hanya untuk pemrosesan satu kali di mana Anda memeriksa hasilnya. Tetapi saya sarankan untuk tidak menggunakannya untuk skrip tingkat produksi.
Ondra Žižka

25

Gunakan csvkit :

csvjoin -c email id_email.csv email_name.csv

atau

csvjoin -c 2,1 id_email.csv email_name.csv

4
Mengapa ini bukan jawaban teratas?
alexg

alat yang luar biasa. Bahkan diakui, bahwa salah satu file saya memiliki pembatas yang berbeda dari ",".
D_K

6

Mungkin ini berlebihan, tetapi Anda dapat mengimpor ke dalam basis data (mis. Basis OpenOffice) sebagai dua jenis tabel dan mendefinisikan laporan yang merupakan keluaran yang diinginkan.

Jika impor CSV merupakan masalah, maka program spreadsheet (mis. OpenOffice Calc) dapat melakukan impor. Hasilnya kemudian dapat dengan mudah ditransfer ke database.


4

Sebagai referensi di masa mendatang, Anda mungkin ingin mulai bermain-main dengan AWK . Ini adalah bahasa scripting kecil yang sangat sederhana yang ada dalam beberapa bentuk pada setiap sistem * nix dan satu-satunya misinya adalah hidup adalah manipulasi dari basis data teks standar yang dibatasi. Dengan beberapa baris script sekali pakai Anda dapat melakukan beberapa hal yang sangat berguna. Bahasa ini kecil dan elegan dan memiliki rasio utilitas / kompleksitas yang lebih baik daripada apa pun yang saya ketahui.


Perl dalam banyak hal merupakan penerus awk.
reinierpost

awk tidak menangani penawaran dan pelolosan (mis. berurusan dengan, s dalam, file CSV terpisah) sejauh yang saya tahu. Jika Anda membutuhkannya, menggunakan perpustakaan penanganan CSV khusus lebih mudah; mereka ada untuk banyak bahasa.
reinierpost

0

Gunakan 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

Coba CSV Cruncher .

Dibutuhkan file CSV sebagai tabel SQL dan kemudian memungkinkan query SQL, menghasilkan file CSV atau JSON lain.

Untuk kasus Anda, Anda cukup menelepon:

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

Alat ini membutuhkan Java 8 atau lebih baru.

Beberapa keuntungan:

  • Anda benar-benar mendapatkan dukungan CSV, bukan hanya "anggap saja datanya benar".
  • Anda dapat bergabung dengan beberapa tombol.
  • Lebih mudah digunakan dan dipahami daripada joinsolusi berbasiskan.
  • Anda dapat menggabungkan lebih dari 2 file CSV.
  • Anda dapat bergabung dengan ekspresi SQL - nilainya tidak harus sama.

Penafian: Saya menulis alat itu. Dulu berantakan setelah Google Code ditutup, tetapi saya menghidupkannya kembali dan menambahkan fitur baru saat saya menggunakannya.


0

Anda bisa membaca file CSV dengan program spreadsheet seperti LibreOffice dan menggunakan VLOOKUP()makro untuk mencari nama di file kedua.


7
Ekstensi file xlsx menyiratkan Microsoft Excel dan saya pikir VLOOKUP juga. Pertanyaan ini ditandai dengan Linux. Apakah Microsoft Excel tersedia untuk Linux?
Peter Mortensen

Sekarang LibreOffice juga memiliki VLOOKUP .
Cristian Ciupitu

-1

Anda juga dapat menggunakan alat yang dirancang khusus untuk menggabungkan file csv, seperti yang ditemukan di https://filerefinery.com

Operasi yang saat ini kami dukung adalah: Menggabungkan file csv. Dimungkinkan untuk melakukan setara SQL operasi gabungan luar, dalam, kiri dan kanan pada dua file csv. Kolom mana yang akan digunakan sebagai kunci bergabung di setiap file yang dapat dikonfigurasi.


Silakan kutip bagian-bagian penting dari jawaban dari tautan referensi, karena jawabannya dapat menjadi tidak valid jika halaman yang tertaut berubah.
DavidPostill

Tidak ada lagi.
Ondra Žižka
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.