使用 Import-Csv 按位置读取可更改的列标题

Use Import-Csv to read changable column Titles by location

我正在尝试查看是否有一种方法可以根据列位置读取 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,它会破坏此代码。如何创建此数组以允许可互换的列标题,但列位置始终相同?

一个选项:

$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

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

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

(很抱歉开始一个新的回答;我还没有足够的声誉来向 mjolinor 的 post 添加评论)

您可以在导入时指定 header 个您自己的:

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

只要您不将数据导出回 CSV(或者不要求原始 headers 也包含在输出 CSV 中),您可以使用任何您喜欢的名称。您还可以指定任意多个 header 名称。如果它们的数量小于 CSV 中的列数,则附加列将被忽略,如果它大于则附加 headers 的列将为空。

如果您需要保留原始 headers,您可以获得需要在变量中使用的 header 名称,如下所示:

$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:

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

$firstCol = $headers[0]