使用PowerShell从CSV中删除列

使用PowerShell从CSV中删除列,powershell,Powershell,我有一个CSV文件,它有重复的列标题,所以我不能使用导入CSV来完成这项工作。标题名称是动态的。我需要得到第三列、第四列以及之后的每四列(例如:从0列开始,第2列、第3列、第7列、第11列、第15列…) 我之所以有重复的列名,是因为标题3需要与标题0相同的名称,一组四个。0>3,4>7,8>11 我使用“获取内容”,因为我不知道如何使用“导入Csv”实现此功能。我必须使用Import Csv来获取列数,而我无法用get Content来计算列数 #Rename every fourth colu

我有一个CSV文件,它有重复的列标题,所以我不能使用导入CSV来完成这项工作。标题名称是动态的。我需要得到第三列、第四列以及之后的每四列(例如:从0列开始,第2列、第3列、第7列、第11列、第15列…)

我之所以有重复的列名,是因为标题3需要与标题0相同的名称,一组四个。0>3,4>7,8>11

我使用“获取内容”,因为我不知道如何使用“导入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),因此我不必再次使用导入Csv。我不知道如何根据数字而不是标题名来获取所需的列

这对于获得第三列(如果从0开始,则为第二列)非常有效,但我不确定如何获得第四列(如果从0开始,则为第三列)

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


我会重新思考整个过程,并从以下内容开始:

$file = "C:\Scripts\File.csv"
$HeaderCount = ((gc sentlog.csv -TotalCount 1).split(',')).count -1
$CSV = import-csv $file -Header (0..$HeaderCount)
现在,您可以将这些列标题视为数组索引来提取所需的列

使用“选择-跳过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

这比我知道的要多得多。我在考虑选择我需要的列,并使用“添加内容”将它们添加到CSV,但它不会创建新列,而是将所有内容添加到其他数据下方的第一列。我认为它不会像您想象的那样复杂。如果您发布一些示例数据和预期输出,我将给您一些示例代码。请注意,如果.csv文件使用带引号的标识符,并且字段包含逗号,那么这将无法完美工作,因为
Import csv
ConvertFrom csv
都能正确处理这些数据,而
Split(',')
则不能。示例:
$x='“1”、“2,3”$x | ConvertFrom Csv-Header$($x.Split(','))| ft-a
@Bacon Bits-我假设拆分可以工作,因为OP是在他现在拥有的代码中进行的-$headers=$headers-Split“,”。数据不包含引号,也不包含额外的逗号。格式化似乎效果不太好,因此我将发布前后数据的屏幕截图。是否有什么原因不能使用
导入Csv
-Header
选项手动指定自己的列标题?
$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