使用Import-Csv按位置

时间:2016-01-04 19:39:04

标签: powershell powershell-v3.0

我正在尝试查看是否有办法根据列位置读取csv文件中的列值。这样做的原因是我正在递送的文件总是让它的标题被更改......

例如,假设csv文件column A(通过excel)如下所示:

ColumnOne
ValueOne
ValueTwo
ValueThree

现在用户更改了标题:

Column 1
ValueOne
ValueTwo
ValueThree

现在我要创建第一列的数组。通常我做的是以下几点:

$arrayFirstColumn = Import-Csv 'C:\test\test1.csv' | where-object {$_.ColumnOne} | select-object -expand 'ColumnOne'

但是,正如我们可以看到ColumnOne更改为Column 1,它会破坏此代码。如何创建此数组以允许可互换的列标题,但列位置将始终相同?

3 个答案:

答案 0 :(得分:2)

您可以在导入时指定自己的标题:

Import-Csv 'C:\path\to\your.csv' -Header 'MyHeaderA','MyHeaderB',...

只要您不将数据导回CSV(或者不要求原始标题也在输出CSV中),您可以使用您喜欢的任何名称。您还可以根据需要指定任意数量的标题名称。如果它们的数量小于CSV中的列数,则会省略其他列,如果它们更大,则其他标题的列将为空。

如果你需要保留原始标题,你可以得到你需要在变量中使用的标题名称,如下所示:

$csv = Import-Csv 'C:\test\test1.csv'

$firstCol = $csv | Select-Object -First 1 | ForEach-Object {
              $_.PSObject.Properties | Select-Object -First 1 -Expand Name
            }

$arrayFirstColumn = $csv | Where-Object {$_.$firstCol} |
                    Select-Object -Expand $firstCol

或者你可以简单地从CSV中读取第一行并将其拆分以获得带有标题的数组:

$headers = (Get-Content 'C:\test\test1.csv' -TotalCount 1) -split ','

$firstCol = $headers[0]

答案 1 :(得分:1)

一个选项:

$ImportFile = 'C:\test\test1.csv'
$FirstColumn = ((Get-Content $ImportFile -TotalCount 2 | ConvertFrom-Csv).psobject.properties.name)[0]
$FirstColumn

$arrayFirstColumn = Import-Csv $ImportFile | where-object {$_.$FirstColumn} | select-object -expand $FirstColumn

答案 2 :(得分:1)

如果您使用的是PowerShell v2.0,则$ mjolinor的答案中$ FirstColumn的表达式为:

$FirstColumn = ((Get-Content $ImportFile -TotalCount 2 | ConvertFrom-Csv).psobject.properties | ForEach-Object {$_.name})[0]

(为开始新答案而道歉;我还没有足够的声誉来为mjolinor的帖子添加评论)