将Import-CSV结果从字符串转换为任意数据类型

时间:2016-04-07 09:48:05

标签: csv powershell

假设我从PowerShell读取了一个CSV文件:

$data = Import-Csv "myfilename.csv"

CSV文件(通常)可以包含字符串和数字,但PowerShell将它们作为字符串存储在内存中:

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

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

导入后,能够从字符串转换类型会很有用。如果只有一列或两列,那么我可以使用计算属性转换它们,如下所示:

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

但是假设我事先并不知道列名和预期类型。相反,我有一个任意的“模式”告诉我哪些列应该是哪种类型,例如:

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

如何将Import-CSV的输出转换为模式确定的类型? (最好以高效/优雅的方式)

示例CSV文件

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

1 个答案:

答案 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
        }