使用 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]
我正在尝试查看是否有一种方法可以根据列位置读取 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]