使用PowerShell从CSV中删除列

时间:2014-12-10 13:40:37

标签: powershell

我有一个包含重复列标题的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 }

下面的屏幕截图。请记住,我不知道每个第四列的标题名称,因为它们可能是任何东西,我只知道数据所在的列号(每四列)。

Before After

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