我有一个包含重复列标题的CSV文件,因此我无法使用Import-Csv来完成工作。标题名称是动态的。我需要得到第三列,第四列和之后的每第四列(例如:从0列2,3,7,11,15 ......开始)。
我有重复列名的原因是标题3需要与标题0相同的名称,以四个为一组。 0> 3,4,4> 7,8> 11 ...
我使用了get-Content,因为我无法弄清楚如何使用Import-Csv。我不得不使用Import-Csv来获取列数,而我无法用Get-Content来解决这些问题。
#Rename every fourth column
$file = "C:\Scripts\File.csv"
$data = get-content $file
$step = 4
$csv = Import-Csv "C:\Scripts\File.csv"
$headers = $data | select -first 1
$count = $csv[0].PSObject.Properties | select -Expand Name
for ($i = 0; $i -lt $count.count; $i += $step)
{
$headers = $headers -split ","
$headers[($i + 3)] = $headers[$i]
$headers[($i + 2)] = "timestamp"
$headers = $headers -join ","
$data[0] = $headers
$data | Set-Content "C:\Scripts\File.csv"
}
如果需要,我可以重用变量$ count(对于$ count.count),所以我不必再次使用Import-Csv。我很难弄清楚如何根据数字而不是标题名称来获取我需要的列。
这对于获得第三列(从0开始时为第2列)非常有用,但我不确定如何在此之后获得每第四列(如果从0开始则为第3列)
type "C:\Scripts\File.csv" | % { $_.Split(",") | select -skip 2 -first 1 }
下面的屏幕截图。请记住,我不知道每个第四列的标题名称,因为它们可能是任何东西,我只知道数据所在的列号(每四列)。
答案 0 :(得分:2)
我重新思考整个过程并从此开始:
$file = "C:\Scripts\File.csv"
$HeaderCount = ((gc sentlog.csv -TotalCount 1).split(',')).count -1
$CSV = import-csv $file -Header (0..$HeaderCount)
现在,您可以将这些列标题视为数组索引,以提取所需的列。
使用Select -Skip 1去除原始标题行。您可以使用计算属性重写导出的属性名称,或者使用从原始标题行中提取的属性名称创建新对象。
好的,根据发布的数据,试试这个:
$file = "C:\Scripts\File.csv"
$OutputFile = "C:\Scripts\OutputFile.csv"
$HeaderCount = ((Get-Content $file -TotalCount 1).split(',')).count -1
$CSV = import-csv $file -Header (0..$HeaderCount)
$SelectedColumns = @(2) + ( (0..$HeaderCount) |? { ($_ % 4) -eq 3 } ) -as [string[]]
$CSV |
select $SelectedColumns |
ConvertTo-CSV -NoTypeInformation |
Select -Skip 1 |
Set-Content $OutputFile