0

これについて本当に助けが必要です:(私はできるだけシンプルにしようとします.

次のような大きなファイルが 1 つあります。

ID,Info1,Info2,info3,...

各行で、1 つの ID と多くのものをコンマで区切って取得しました。3000 行を超える場合があります。

今、私は次のような2番目のファイルを取得しました:

ID,Info4,Info5,Info6,...

最初のファイルにはすべての要素が含まれていますが、2 番目のファイルにはそれらの一部のみが含まれています。

たとえば、最初のもの:

BLA1,some stuff...
BLA2,some stuff...
BLA3,some stuff...
ALO1,some stuff...
ALO2,some stuff...

そして2つ目:¨

BLA3,some stuff2... 
ALO1,some stuff2...
BLA1,some stuff2... 

私が欲しいのは簡単です.2番目のファイルのすべての「some stuff2 ...」を最初のファイルに追加したい.with join type=leftsqlのように

最初のファイルに今すぐ持ってもらいたい:

BLA1,some stuff...,some stuff2...
BLA2,some stuff...
BLA3,some stuff...,some stuff2...
ALO1,some stuff...,some stuff2...
ALO2,some stuff...

私はこのようなことを試しました:

ForEach ($line in $file1) {
    $colA = $line.Split(',')
    ForEach ($line in $file2) {
        $colB = $line.Split(',')
        if($colA[0]-eq $colB[0]) { #Item found in file2
            $out += $date + $colA[1]+","+ ... +","+ $colB[1]+","+ ... +"`n"
        }else { 
            $out += $date + $colA[1]+","+ ... +"`n"
        }
    }
}

しかし、成功しないには時間がかかります(そして、私が見たことのない他の問題があったのかもしれません)。最善の方法は何ですか?二次元配列?ID を並べ替えてから少しスクリプトを作成することもできますが、数値だけではないため、処理方法がわかりません。

助けてくれてありがとう、

4

3 に答える 3

1

私は、あなたがヘッダー行を知っているか、それらを追加できるという前提で行きました...

f1.csv

Name,Item_1
BLA1,thing_bla1_1
ALB1,thing_alb1_1
BLA2,thing_bla2_1
ALB2,thing_alb2_1
BLA3,thing_bla3_1
ALB3,thing_alb3_1

f2.csv

Name,Item_2
BLA3,thing_bla3_2
ALB3,thing_alb3_2
BLA1,thing_bla1_2
ALB1,thing_alb1_2
BLA2,thing_bla2_2
ALB2,thing_alb2_2

コード:

$grouped = Import-Csv .\f1.csv, .\f2.csv | group -property Name -ashashtable

$($grouped.Keys | foreach {$obj = $grouped.Item("$_")[0].Name + "," + $grouped.Item("$_")[0].Item_1 + "," + $grouped.Item("$_")[1].Item_2; $obj}) | Out-File .\test.csv

ここで行っているのは、2 つの CSV を 1 つの要素にインポートしてから、同じ名前のアイテムをハッシュ テーブルにグループ化することです。次に、キー (ファイルからの重複していない名前) を foreach にパイプして、それらを 1 行に結合します。出力を Out-File にパイプできるようにするには、これらのステートメントを $() で囲む必要があります。

foreach の内部を処理するためのよりクリーンな方法があることはほぼ間違いありませんが、これは機能します。

出力 (text.csv):

ALB1,thing_alb1_1,thing_alb1_2
BLA2,thing_bla2_1,thing_bla2_2
ALB3,thing_alb3_1,thing_alb3_2
BLA1,thing_bla1_1,thing_bla1_2
ALB2,thing_alb2_1,thing_alb2_2
BLA3,thing_bla3_1,thing_bla3_2
于 2013-08-29T18:21:00.770 に答える
0

を実行したい場合はLEFT JOIN、ファイルを一時データベースにロードして、実際にLEFT JOIN. SQLiteを使用した例については、こちらを参照してください。

于 2013-08-30T00:12:42.490 に答える