2013年10月14日月曜日

2つのCSVファイルから項目に一致した行を出力

概要

2つのCSVファイル(顧客マスタ、商品マスタ)から、顧客マスタに商品マスタ.商品コードが存在するものをPowerShellを使ってCSV出力する

メモ

CSVファイル

■商品マスタ(items.csv)

ITEM_ID,ITEM_NAME
10000,AAAAAA
10001,BBBBBB
10002,CCCCCC
・・・・
・・・・
■顧客マスタ(customers.csv)
CUSTOMER_ID,ITEM_ID,CUSTOMER_NAME,QUANTITY
8000,10000,aaaaa,100
8000,10002,bbbbb,50
8001,10005,ccccc,1000
・・・・
・・・・

SQL文だと以下のような感じ

■SQL

SELECT CUSTOMERS.* FROM CUSTOMERS, ITEMS 
WHERE CUSTOMERS.ITEM_ID = ITEMS.ITEM_ID

PowerShell その1

$result = Import-Csv c:\items.csv | Select-Object ITEM_ID 
Import-Csv c:\customers.csv | Where-Object {$result -match $_.ITEM_ID} | Export-Csv c:\output.csv -NoType
customers.csvが10万件、items.csvが1万件で約数十分ぐらいかかる(※スペックによるがとにかく遅い!!)

PowerShell その2

その1の場合、シンプルだが遅いので
items.csvをHashTableにセット(ITEM_IDに重複がないこと)する方法で解決した(約20秒ぐらいで終わる)

$hash = @{}
Import-Csv c:\items.csv | ForEach-Object {$hash.Add($_.ITEM_ID, $_)}
Import-Csv c:\customers.csv | ForEach-Object {if($hash.Get_Item($_.ITEM_ID)){$_}} | Export-Csv c:\output.csv -NoType

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。