2011-12-15 101 views
1

動的メモプロパティ名を使用してCSVファイルからデータをインポートするにはどうすればよいですか?つまり、あらかじめ列の名前を知っているわけではありません。パターンに一致し、スクリプトの実行時にCSVファイルから抽出されます。例えばとしてPowershell:動的変数名で変数を取得

は、CSVファイルを検討:

"Header 1","Header A","Header 3","Header B" 
0,0,0,0 
1,2,3,4 
5,6,7,8 

を私は手紙で終わる列のみを抽出したいと思います。 CSVファイルにアクセスするには、

"Header A" 
"Header B" 

:これを行うには、私は、ヘッダー行を読んで、そのような正規表現で名を抽出、

$reader = new-object IO.StreamReader("C:\tmp\data.csv") 
$line = $reader.ReadLine() 
$headers = @() 

$line.Split(",") | % { 
    $m = [regex]::match($_, '("Header [A-Z]")') 
    if($m.Success) { $headers += $m.value } } 

これは、私が気にすべての列名を取得します

$csvData = import-csv "C:\tmp\data.csv" 

Import-CSVはヘッダー行ごとにプロパティを持つカスタムオブジェクトを作成します。このようにNotePropertyの名前でフィールドにアクセスすることができます。

$csvData | % { $_."Header A" } # Works fine 

これは明らかに列名を事前に知る必要があります。私は抽出して$headersに格納された列名を使用したいと思います。どうすればいい?

私はそれが列名を知らない別のスクリプトを書きますので、私は次のようにスクリプトを変更することができ、これまで

$csvData | % { $_.$headers[0] } # Error: Cannot index into a null array. 
$csvData | % { $np = $headers[0]; $_.$np } # Doesn't print anything. 
$csvData | % { $_.$($headers[0]) } # Doesn't print anything. 

を試みたいくつかのもの。それは私の唯一の解決策ですか?

答えて

0

私の心に来た最初の事(そして唯一の...申し訳ありませんが)です:

$csvData | % { $_.$(($csvData | gm | ? { $_.membertype -eq "noteproperty"})[0].name) } 

最初の列の値と

$csvData | % { $_.$(($csvData | gm | ? { $_.membertype -eq "noteproperty"})[1].name) } 

第二カラムなどのためを得るためにon ....

これはあなたが必要なものですか?

+0

ほとんど。あらかじめ索引を知っておく必要がありますが、似たような検索を追加すれば簡単に修正できます: '$ csvData | $($ headers [0])})。})} ' – vonPryz

+0

ありがとうございました。これはまさに私が必要としたものでした。 – vonPryz

+0

@vonPryz - これはまさにあなたが必要としていたものですか?クリスチャン - 犯罪はありません。 – manojlds

3

私はあなたがこれをしたいと思う:

[string[]]$headers = $csvdata | gm -MemberType "noteproperty" | 
         ?{ $_.Name -match "Header [a-zA-Z]$"} | 
         select -expand Name 
$csvdata | select $headers 

は、条件に一致するヘッダ(文字で終わるこの場合、もの)を選択し、それらのヘッダー用のCSVデータを取得します。

0

手動でCSVファイルを解析するために、カスタムスクリプトを使用することができます。

​​