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?

crst53
sumber
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.

hyperslug
sumber
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
Tgr
sumber
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.

Peter Mortensen
sumber
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.

Jim di austin
sumber
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()

}
chrislusf
sumber
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.

Ondra Žižka
sumber
0

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

Janek
sumber
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.

seperti T
sumber
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