実現したいこと
前提条件
Powershellを使用
CSVは同一フォルダに格納
各CSVは列数が異なるが、キー項目のインデックスは同じ
CSVのサイズは最大6GBほど
実現したいこと
csvファイル)
A、B、C、D、E
csv記載例)
A列、B列、名前、生年月日、住所、郵便番号......
各CSVを比較し、キー項目(名前、生年月日、郵便番号)が重複している項目を抽出し、リスト化したい
全CSV間での重複結果が必要なため、総当たりになると考えている。
比較パターン)
A-B B-C C-D D-E
A-C B-D C-E
A-D B-E
A-E
発生している問題・分からないこと
sort -Unique等での実装を考えたが、CSVの容量が重く実装が難しかった。
0. 番号リストimport-csvで読み込もうとしたところでメモリ不足が発生して処理が行えない
1.sort -Uniqueは重複を削除してしまい、今回得たい結果とは異なるので断念。
単純なスキル不足から実装方法が見えてこない。
該当のソースコード
PowerShell
1#比較するCSVらがあるフォルダ 2$work_path = "C:\重複リスト出力\データ" 3$work_path2 = "C:\重複リスト出力\キーファイル\keyFile.csv" 4$work_path3 = "C:\重複リスト出力\結果\重複リスト.csv" 5Set-Location -Path $work_path 6 7#作業フォルダ内で拡張子が.csvのみのファイルをフィルターして取得 8$csv_files = Get-ChildItem -File -Filter *.csv 9 10#キーファイル作成 11$keyfiles = @() 12$duplicate_list = @() 13$headers = @('KDB個人番号','氏名_カナ','生年月日','郵便番号') 14 15 16Write-Host $csv_files 17 18foreach($csv_file in $csv_files){ 19 20 #CSV読み込み 21 $path = Join-Path $work_path $csv_file 22 $csvdata = Import-Csv $Path -Encoding unicode 23 24 if(Test-Path $work_path2){ 25 $keyfiles = Import-Csv $work_path2 -Encoding unicode 26 } 27 #レコード分ループ 28 foreach($row in $csvdata){ 29 30 #判定 31 $newdata = $keyfiles | Where-Object {($_.氏名_カナ -eq $row.氏名_カナ) -and ($_.生年月日 -eq $row.生年月日_西暦) -and ($_.郵便番号 -eq $row.郵便番号)} 32 if($newdata.Count -eq 0){ 33 34 #重複していないデータの場合、キーファイルに追加 35 $record = New-Object PSObject | Select-Object $headers 36 $record.KDB個人番号 = $row.KDB個人番号 37 $record.氏名_カナ = $row.氏名_カナ 38 $record.生年月日 = $row.生年月日_西暦 39 $record.郵便番号 = $row.郵便番号 40 $keyfiles += $record 41 }else{ 42 43 if(($duplicate_list | Where-Object {($_.氏名_カナ -eq $row.氏名_カナ) -and ($_.生年月日 -eq $row.生年月日_西暦) -and ($_.郵便番号 -eq $row.郵便番号)}).Count -eq 0){ 44 45 #既にキーファイルに存在するかつ重複リストに存在しない場合、重複リストに追加 46 $record = New-Object PSObject | Select-Object $headers 47 $record.KDB個人番号 = $row.KDB個人番号 48 $record.氏名_カナ = $row.氏名_カナ 49 $record.生年月日 = $row.生年月日_西暦 50 $record.郵便番号 = $row.郵便番号 51 $duplicate_list += $record 52 53 } 54 55 } 56 57 } 58 #CSV読み終わるごとにCSV出力(メモリ削減のため) 59 $keyfiles | Export-Csv -Encoding unicode -NoTypeInformation -Path $work_path2 60} 61 62#重複リストに出力 63$duplicate_list | Export-Csv -Encoding unicode -NoTypeInformation -Path $work_path3
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
PowerShellでの重複削除方法
sort -Unique等で重複を削除できることは分かったが、今回は重複データを消したいわけではないため
成果は得られなかった
補足
特になし
> CSVの容量が重く
具体的にはどの程度になるのでしょうか?(TB レベル?)
最大で6gbほどになります。
> sort -Unique等での実装を考えたが、CSVの容量が重く実装が難しかった。
具体的に**どのような実装**を考えて、「容量が重く」なることで具体的に**どのような問題**が起きて、「難しかった」と判断したのでしょうか。具体的に書いてください (このコメント欄に書くのではなく、質問文を編集して書いてください)。
取り急ぎ、「メモリリーク」という言葉の使い方がまちがっています。「メモリ不足」に訂正しておいてください。
Powershell の利用が絶対的な条件でなければ、Python + Pandas で処理してもよさそうです。

回答3件
あなたの回答
tips
プレビュー