2016-05-11 71 views
0

ヘッダーとデータとしてそこに入る文字列としての.csvファイル(区切り記号は|)があります。私はキーとして列ヘッダーとデータとして文字列情報を持っているその.csvファイルからハッシュテーブルを作成したいと思います。Powershellを使用してヘッダー付き.CSVファイルからハッシュテーブルを作成する

LastName|FirstName|Office|Employeeid|BusinessTitle|CoreSector|Sector|CmbCorePractice|CmbPractice|Region|Committees|SectorLeaderRole|PracticeLeaderRole|AreaCountryRole|FirmLeaderShipRoleOne|FirmLeaderShipRole|generationQualifier|givenName|middlename|sn|extensionAttribute12|homePostalAddress|telephoneNumber|ipPhone|facsimileTelephoneNumber|mobile|homePhone|department|manager|assistant|extensionAttribute13 
SMITH|JAMES|AMSTERDAM|0000000000|Leader|Healthcare|#|#|#|Europe|#|#|#|#|#|#|MR|JAMES|#|SMITH|#|#|+1 212 000 7692|0000|#|#|#|Knowledge Management|0001000000|#|#|#|# 

データはSMITHとし、ラインアップLastNameとすることを開始します:ここで

はファイル形式です。

+3

file.csvに以下のサンプルデータを考えると

# Constants. $DELIM = ',' $CSV_F = 'file.csv' # Parse keys $keys = (gc "${CSV_F}" -TotalCount 1).Split($DELIM) $csv = Import-CSV "${CSV_F}" $data = @() # Iterate through CSV to build array of hashtables. ForEach ($r in $csv) { $tmp_h = @{} # Create hash of key-value pairs. ForEach($k in $keys) { $tmp_h[$k] = $r.($k) } # Add hash to array of hashes. $data += $tmp_h } # Display data $data.ForEach({[PSCustomObject]$_}) | ft -AutoSize 

)、実装しようとしたコード(そしてどこで失敗したか) – gravity

+2

しかし、なぜですか? :)オブジェクトの配列は非常に扱いやすく、より安全です(どの属性値が一緒に属しているかわかります)。 '$ ad = import-csv -path myfile.csv -delimiter 'を使って簡単にインポートできます。 " –

+0

@FrodeF。 - 最終的には、.csvファイルの内容とADの内容を比較したいので、ファイルがソースであるためにADだけを更新することができます。ハッシュテーブルを使用するのが最善だと思います。現在のスクリプトは.csvファイルを調べ、新しいかどうかの情報でADを更新します(情報はファイルとADでは同じですが、ファイルはまだADを上書きします)。 – allenr74

答えて

3

これは簡単です。このように、ハッシュテーブルのキーを取得するには、CSVの最初の行を読む:

$keys = (Get-Content 'C:\path\to\your.csv' -TotalCount 1) -split '\|' 

またはこのような

$keys = (Get-Content 'C:\path\to\your.csv' -TotalCount 1).Split('|') 

次のインポートCSVを:

$csv = Import-Csv 'C:\path\to\your.csv' -Delimiter '|' 

その後収集CSVの列をハッシュテーブルに変換する:

$ht = @{} 
foreach ($key in $keys) { 
    $ht[$key] = $csv | Select -Expand $key 
} 
+0

ありがとう@AnsgarWiechers私はあなたのスクリプトを試しましたが、それは個々の文字にキーを分割するようです。最初のレコードで動作するように見えますが、後続のレコードでは動作しません。私はソースファイルを添付します。 – allenr74

+1

@ allenr74: '-split '|''の代わりに '-split '\ |''を試してください。 '-split'演算子のseparator引数は正規表現として解釈されるので、リテラル' | 'を使うためには' \ 'エスケープする必要があります。 – mklement0

0

何か似たようなやり方を決めようとしているうちに、私はこの記事に出会った。私の目標は、CSVの最初の行から一般的に列名を取得することでした(この問題を解決するための優れた答えは、Ansgar Wiechers'です)。 Ansgar's answerは、各キーの値がそのキーのすべての値の配列であるハッシュテーブルを作成します。

私の目的のためには、各要素の値がハッシュテーブルである配列が必要でした。つまり、配列の各要素は元のCSVの行に対応します。これにより、CSVの各レコードを繰り返し処理し、レコードの各列を繰り返し処理できるという利点があります。

最終的に彼のデータを必要とする形式のOPの要件がうまくはっきりしていなかったので、私はAnsgar'sの補足として私の解決策を投稿したいと考えました。

OPの特定のユースケースに合わせるには、の値を,から|に変更するだけでよいことに注意してください。

RecordId,Name,Value 
1,Alpha,Kilo 
2,Bravo,Lima 
3,Charlie,Mike 
4,Delta,November 
5,Echo,Oscar 
6,Foxtrot,Papa 
7,Golf,Quebec 
8,Hotel,Romeo 
9,India,Sierra 
10,Juliet,Tango 

次の出力が生成されます(例:CSVデータを難読化はもちろんの:それは私たちが見に役立つだろう

Name Value RecordId 
---- ----- -------- 
Alpha Kilo  1 
Bravo Lima  2 
Charlie Mike  3 
Delta November 4 
Echo Oscar 5 
Foxtrot Papa  6 
Golf Quebec 7 
Hotel Romeo 8 
India Sierra 9 
Juliet Tango 10 
関連する問題