2つのCSVファイルを結合する方法は?


22

IDとメールの2つのフィールドを持つ1つのCSVファイルがあるとします。電子メールと名前の2つのフィールドを持つ別のファイルがあります。3つのフィールドすべてを電子メールで結合したファイルを作成するにはどうすればよいですか?


5
結合に関するもう少し詳細(つまり、内部、外部、左)。1番目のCSVのメーリングリストは2番目のリストと同じですか?それともそれ以上含まれていますか?
hyperslug

csvファイルの例は、使用しているOSとともに便利です。
トロギー09

1番目と2番目のリストは同じだと思います。Linuxを使用しています。助けてください!!!ありがとう!! :)
crst53 09

1
データの大きさは?
ジョシュア

回答:


24

改訂3

メールの両方のリストをアルファベット順に並べ替えてから参加する必要があります。電子メールフィールドがfile1の2番目のフィールドとfile2の1番目のフィールドである場合:

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

パラメータの意味

-t、: '、'はフィールド区切り記号です
-k 2,2:2番目のフィールドでの文字ソート
-k 1,1:1番目のフィールドでの文字ソート
-1 2:ファイル1、2番目のフィールド
-2 1:ファイル2、1番目のフィールド
>:ファイルへの出力

生産する

メール、ID、名前
メール、ID、名前
...

メールでアルファベット順にソートされています。

いずれかのファイルからメールが欠落している場合、結果から除外されることに注意してください。


2
CSVはこれよりも複雑です。たとえば、フィールド区切り文字はエスケープできます。
pguardiario 16

@hyperslugで完全外部結合を実行できますか?
アブショーブ

IDにコンマが含まれている場合、CSVが引用符付き/引用符なしで混在している場合、これは機能しません。このソリューションは、結果を確認する1回限りの処理にのみ使用してください。ただし、実稼働レベルのスクリプトには使用しないことをお勧めします。
オンドラŽižka18年

25

csvkitを使用します

csvjoin -c email id_email.csv email_name.csv

または

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

4
なぜこれが一番の答えではないのですか?
alexg

素晴らしいツール。私のファイルの1つが「、」区切り文字とは異なることを認識しました。
D_K

6

おそらくやり過ぎかもしれませんが、2種類のテーブルとしてデータベース(OpenOffice Baseなど)にインポートし、目的の出力であるレポートを定義できます。

CSVのインポートに問題がある場合は、スプレッドシートプログラム(OpenOffice Calcなど)でインポートできます。その後、結果をデータベースに簡単に転送できます。


4

将来の参考として、AWKで遊んでみてください。それは、すべての* nixシステムに何らかの形で存在する非常に単純な小さなスクリプト言語であり、その唯一の使命は、標準の区切られたテキストデータベースの操作です。数行の使い捨てスクリプトを使用すると、非常に便利なことができます。この言語は小さくてエレガントで、私が知っている他のものよりも有用性/複雑さの比が優れています。


Perlは多くの点でawkの後継です。
reinierpost

私が知っている限り、awkはクォートとエスケープ(たとえば、-で区切られたCSVファイル内のsの処理)を処理しません。必要な場合は、専用のCSV処理ライブラリを使用する方が簡単です。それらは多くの言語に存在します。
reinierpost

0

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

CSV Cruncherをお試しください。

CSVファイルをSQLテーブルとして取得し、SQLクエリを許可して、別のCSVファイルまたはJSONファイルを作成します。

あなたの場合、あなたはただ電話するでしょう:

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

ツールにはJava 8以降が必要です。

いくつかの利点:

  • 「データが正しいと仮定しましょう」だけでなく、CSVのサポートも得られます。
  • 複数のキーで参加できます。
  • joinベースのソリューションよりも使いやすく、理解しやすい。
  • 3つ以上のCSVファイルを結合できます。
  • SQL式で結合できます-値は同じである必要はありません。

免責事項:私はそのツールを書きました。Google Codeが閉じられた後は、以前は混乱していたが、それを復活させ、使用するにつれて新しい機能を追加した。


0

LibreOfficeなどのスプレッドシートプログラムでCSVファイルを読み取り、VLOOKUP()マクロを使用して2番目のファイルで名前を検索できます。


7
ファイル拡張子xlsxはMicrosoft Excelを意味し、VLOOKUPも同様だと思います。この質問にはLinuxのタグが付けられています。Microsoft ExcelはLinuxで利用できますか?
ピーターモーテンセン

LibreOfficeにはVLOOKUPもあります。
クリスティアン・Ciupitu 14年

-1

https://filerefinery.comにあるような、csvファイルを結合するために特別に設計されたツールを使用することもできます。

現在サポートしている操作は次のとおりです。csvファイルの結合。2つのcsvファイルに対して、外部、内部、左、および右の結合操作に相当するSQLを実行することができます。各ファイルで結合キーとして使用される列は構成可能です。


リンクされたページが変更されると回答が無効になる可能性があるため、回答の重要な部分を参照リンクから引用してください。
DavidPostill

もはや存在しない。
オンドラジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.