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