使用PowerShell的Import-Csv cmdlet将CSV类型转换为原始类型的快速方法?

时间:2013-07-25 11:57:25

标签: powershell powershell-v2.0

我正在使用PowerShell v2并使用以下代码定义了一个名为Material的自定义类型:

add-type @"
public struct Material {
    public string BusinessUnit;
    public string Source;
    public string PrimarySource;
    public string LegacyMaterialNumber;
}
"@

...我收集了这种类型的对象,我正在使用Export-Csv cmdlet写入CSV文件。这工作正常,并生成具有如下指定的原始类型的数据:

#TYPE Material          
BusinessUnit,Source,PrimarySource,LegacyMaterialNumber
BU1,NAFO,NAFO-FG,17502
BU1,NAFO,NAFO-FG,17504
BU1,NAFO,NAFO-FG,17739
BU1,NAFO,NAFO-FG,17837
BU1,NAFO,NAFO-FG,17841

我遇到的问题是当我使用 Import-Csv 导入此数据时,每行都被创建为类型:

CSV:Material

...而不是我开始使用的原始类型:

Material

在我的具体情况下,这是一个问题,因为我想将每个Material传递给一个函数,该函数具有一个特定类型为 Material 的参数。我可以解析每一行并使用数据重建我的Material对象,但是有一种快速方法可以将CSV数据导入为原始类型吗?

2 个答案:

答案 0 :(得分:2)

Import-Csv想要创建基于PSObject的类型。您可以创建转换函数(或过滤器)以转换为材料类型。然后将import-csv的输出传递给此函数并进入目标数组:

filter convert-csvToMaterial([Parameter(Mandatory=$true,ValueFromPipeline=$true)]$csvMaterial)
{
    $material = new-object -TypeName Material 
    $material.BusinessUnit = $csvMaterial.BusinessUnit
    $material.LegacyMaterialNumber = $csvMaterial.LegacyMaterialNumber
    $material.PrimarySource = $csvMaterial.PrimarySource
    $material.Source = $csvMaterial.Source
    $material
}

$importedMaterial = import-csv .\materialList.csv | convert-csvToMaterial

答案 1 :(得分:0)

另一种选择是从Import-Csv返回的自定义对象动态创建哈希表,并将它们用作New-Object-Property参数:

filter Convert-CsvToType( [string]$TypeName ) {
  $_.PSObject.Properties |
    foreach { $h = @{} } {
      $h[$_.Name] = $_.Value
    } { New-Object $TypeName -Property $h }
}

Import-Csv .\materialList.csv | Convert-CsvToType Material