İki CSV dosyasına nasıl katılırım?


22

2 alana sahip bir CSV dosyanız olduğunu varsayalım: Kimlik ve e-posta. 2 alanlı başka bir dosyanız var: e-posta ve ad. Her üç alanın e-postaya katıldığı bir dosyayı nasıl oluşturabilirsiniz?


5
Birleştirme hakkında biraz daha ayrıntılı (yani, iç, dış, sol). 1. CSV'deki e-posta listesi ikinci listeyle aynı mı? Yoksa daha fazlası var mı?
hyperslug

Csv dosyalarına örnekler, kullandığınız işletim sistemi ile birlikte kullanışlıdır?
Troggy

bence 1. ve 2. liste aynı. Linux kullanıyorum. Lütfen yardım et!!! Teşekkürler!! :)
crst53

1
veriler ne kadar büyük?
Joshua

Yanıtlar:


24

Revizyon3 :

E-postadaki her iki listeyi de alfabetik olarak sıralamanız ve ardından katılmanız gerekir. E-posta alanının dosya1'in 2. alanı ve dosya2'nin 1. alanı dikkate alındığında:

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

parametre anlamı

-t,: ',' alan ayırıcıdır
-k 2,2: 2. alanda karakter sıralama
-k 1,1: 1. alanda karakter sıralama
-1 2: dosya 1, 2. alan
-2 1: dosya 2, 1. alan
>: dosyaya çıktı

üretir

E-posta, kimliği, adı
E-posta, kimliği, adı
...

e-posta ile alfabetik olarak sıralanmıştır.

Her iki dosyada da herhangi bir e-posta eksikse, sonuçlardan çıkarılamayacağını unutmayın.


2
CSV bundan daha karmaşıktır. Alan ayırıcısı örneğin kaçabilir.
pguardiario

@hyperslug tam dış birleştirme yapabilir miyim?
Ebu Shoeb

Kimlik virgül içeriyorsa, CSV tırnak içine alınmış / sıralanmamışsa bu çalışmaz. Bu çözümü yalnızca sonucu kontrol ettiğiniz tek seferlik işlemler için kullanın. Ancak bunu üretim düzeyinde bir komut dosyası için kullanmamanızı öneririm.
Ondra Novižka

25

Csvkit kullanın :

csvjoin -c email id_email.csv email_name.csv

veya

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

4
Bu neden en iyi cevap değil?
alexg

harika bir araç. Hatta fark ettim ki, dosyalarımdan biri "," sınırlayıcıdan farklı.
D_K

6

Belki çok fazladır, ancak iki tür tablo olarak bir veritabanına (örneğin OpenOffice Base) içe aktarabilir ve istenen çıktı olan bir rapor tanımlayabilirsiniz.

CSV içe aktarma sorunu varsa, bir elektronik tablo programı (örn. OpenOffice Calc) içe aktarma yapabilir. Sonuç daha sonra kolayca veritabanına aktarılabilir.


4

Gelecekte referans olarak AWK ile oynamaya başlamak isteyebilirsiniz . Her * nix sisteminde bir şekilde var olan çok basit küçük bir betik dilidir ve tek görevi hayatın standart sınırlandırılmış metin veritabanlarının manipülasyonudur. Birkaç satırlık komut dosyasıyla çok yararlı şeyler yapabilirsiniz. Dil küçük ve zariftir ve bildiğim her şeyden daha iyi bir yarar / karmaşıklık oranına sahiptir.


Perl birçok yönden awk'ın ardılıdır.
reinierpost

awk bildiğim kadarıyla alıntı ve kaçış (örneğin, bir, ayrılmış CSV dosyasında ele almak) işlemez. Buna ihtiyacınız varsa, özel bir CSV işleme kütüphanesi kullanmak daha kolaydır; birçok dil için var olurlar.
reinierpost

0

Go kullanın: 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

CSV Cruncher'ı deneyin .

CSV dosyalarını SQL tabloları olarak alır ve SQL sorgularına izin vererek başka bir CSV veya JSON dosyası oluşturur.

Davanız için sadece şunu arayabilirsiniz:

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

Araç için Java 8 veya üzeri gerekir.

Avantajlardan bazıları:

  • CSV desteği alıyorsunuz, sadece "verilerin doğru olduğunu varsayalım" değil.
  • Birden fazla tuşa katılabilirsiniz.
  • joinBazlı çözümlerin kullanımı ve anlaşılması daha kolaydır .
  • 2'den fazla CSV dosyasını birleştirebilirsiniz.
  • SQL ifadelerine katılabilirsiniz - değerlerin aynı olması gerekmez.

Feragatname: Bu aracı yazdım. Google Code kapatıldıktan sonra kargaşa içindeydi, ancak onu yeniden canlandırdım ve kullandığım yeni özellikler ekledim.


0

CSV dosyasını LibreOffice gibi bir elektronik tablo programıyla okuyabilir ve VLOOKUP()ikinci dosyada adı aramak için makro kullanabilirsiniz .


7
Dosya uzantısı xlsx Microsoft Excel anlamına gelir ve ben de DÜŞEYARA da yapar. Bu soru Linux ile etiketlenmiştir. Microsoft Excel Linux için kullanılabilir mi?
Peter Mortensen

Şimdi LibreOffice'in DÜŞEYARA da var.
Cristian Ciupitu

-1

Ayrıca https://filerefinery.com adresinde bulunan gibi csv dosyalarına katılmak için özel olarak tasarlanmış bir araç da kullanabilirsiniz.

Şu anda desteklediğimiz işlemler şunlardır: csv dosyalarına katılma. Dış, iç, sol ve sağ birleştirme işlemlerinin SQL eşdeğerini iki csv dosyasında gerçekleştirmek mümkündür. Her bir dosyada birleştirme anahtarı olarak kullanılacak sütun yapılandırılabilir.


Bağlantı verilen sayfalar değişirse yanıt geçersiz olabileceğinden, lütfen yanıtın önemli kısımlarını referans bağlantılarından alıntılayın.
DavidPostill

Artık yok.
Ondra Žižka
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.