2016-04-07 20 views
0

私はPowerShellのからCSVファイルを読み込むとします(一般的に)文字列から任意のデータ型にインポート、CSV結果を変換する

$data = Import-Csv "myfilename.csv" 

CSVファイルは、文字列と数字を含めることができますが、PowerShellはとしてメモリに格納します文字列:

PS D:\> $data[0].Col3.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object

インポート後、文字列から型を変換できると便利です。 1つまたは2つの列がある場合、私は次のように計算されたプロパティを使用して、それらを変換することができます

$data = Import-Csv "myfilename.csv" | 
     select -Property @{n='Col2';e={[int]$_.Col2}}, 
      @{n='Col3';e={[double]$_.Col3}} 

しかし、私は事前にカラム名を知っていると型を意図していないと仮定します。スキーマによって決定される

$Schema = @{Col1=[string];Col2=[int];Col3=[double]} 

がどのように私はタイプにインポート、CSVからの出力を変換することができます:代わりに私は、任意の「スキーマ」とは、例えば、どのタイプであるべき列私に告げるがありますか? (好ましくは、効率的な/エレガントな方法で)

サンプルCSVファイル

"Col1","Col2","Col3" 
"a",2,4.3 
"b",5,7.9
+0

この質問は以前投稿したものと大きく異なります(後で削除しました) –

答えて

1

あなたは-asキャストでこれを行うことができます:あなたができる列の任意の数のために

$data = Import-Csv "myfilename.csv" | 
     select -Property @{n='Col2';e={$_.Col2 -as $Schema.Col2}}, 
      @{n='Col3';e=$_.Col3 -as $Schema.Col3}} 

this answerで概説されているアプローチを同様の質問に拡張してください:

$data = Import-Csv "myfilename.csv" | Foreach-Object { 
      foreach ($property in $_.PSObject.Properties) { 
      $property.Value = $property.Value -as $Schema[$property.Name] 
      } 
      $_ # return the modified object 
     } 
+0

$スキーマにはいくつの列があるのか​​分からないなど、任意の$スキーマではどうすればよいですか –

+0

'$ Schema [COLUMN_NAME]'を使ってハッシュ値にアクセスするためにカラム名を使うか、 'array'を定義して特定のカラムにインデックスでアクセスすることができます。 –

+0

これは、列名に対してforループを提案しているようです。これを反映するようにコードを編集できますか? –

関連する問題