it-swarm-ja.tech

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

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

23
crst53

Revision

メールの両方のリストをアルファベット順に並べ替えてから、参加する必要があります。 emailフィールドが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、: '、'はフィールドセパレーターです。 ____。]-1 2:ファイル1、2番目のフィールド
-2 1:ファイル2、1番目のフィールド
>:ファイルに出力

作り出す

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

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

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

24
hyperslug

csvkit を使用:

csvjoin -c email id_email.csv email_name.csv

または

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

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

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

6
Peter Mortensen

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

4
jim in austin

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ベースのソリューションよりも使いやすく、理解しやすいです。
  • 2つ以上のCSVファイルを組み合わせることができます。
  • SQL式で結合できます。値は同じである必要はありません。

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

0
Ondra Žižka

Bash 5.0.3でGNU Coreutils 8.30を使用し、 hyperslugの答えを基に構築しています

行が重複している未ソートのCSVファイルがあり、_file1.csv_または_file2.csv_のいずれかの行にフィールドがないためにデータを省略したくない場合は、次のようにできます。

ファイル1をフィールド2でソートし、ファイル2をフィールド1でソートします。

_( head -n1 file1.csv && tail -n+2 file1.csv | sort -t, -k2,2 ) > sort1.csv
( head -n1 file2.csv && tail -n+2 file2.csv | sort -t, -k1,1 ) > sort2.csv
_

ハイパースラグのパラメーターを拡張する:

_-k 2,2     : character sort starting and stopping on 2nd field
-k 1,1     : character sort starting and stopping on 1st field
head -n1   : read first line
tail -n+1: : read all but first line
(  )       : subshell
>          : output to file
_

CSVファイルの最初のヘッダー行を保持するために、サブシェル__( )_内でheadおよびtailを実行する必要がありました特定のフィールドによるソート

そして、

_join -t , -a1 -a2 -1 2 -2 1 -o auto sort1.csv sort2.csv > sort3.csv
_

ハイパースラグのパラメーターを拡張する:

_-t ,    : ',' is the field separator
-a1     : Do not omit lines from file 1 if no match in file 2 found
-a2     : Do not omit lines from file 2 if no match in file 1 found.
-1 2    : file 1, 2nd field
-2 1    : file 2, 1st field
-o auto : Auto format: includes extra commas indicating unmatched fields
>       : output to file
_

次に、_file1.csv_、_file2.csv_、および結果の_sort3.csv_の例を示します。

_file1.csv_:

_ID,email
02,[email protected]
03,[email protected]
05,[email protected]
07,[email protected]
11,[email protected]
_

_file2.csv_:

_email,name
[email protected],Timothy Brown
[email protected],Robert Green
[email protected],Raul Vasquez
[email protected],Carol Lindsey
_

_sort3.csv_:

_email,ID,name
[email protected],02,Robert Green
[email protected],,Carol Lindsey
[email protected],03,
[email protected],07,Raul Vasquez
[email protected],05,
[email protected],,Timothy Brown
[email protected],11,
_

Timothy BrownとCarol LindseyにはIDがありませんが、結合されたCSVファイルにまだ含まれています(名前と電子メールが正しいフィールドにあります)。

0
baltakatei

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

0
Janek

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
chrislusf