假设我从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
答案 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
}