【问题标题】:Deleting columns from CSV using PowerShell使用 PowerShell 从 CSV 中删除列
【发布时间】:2014-12-10 13:40:36
【问题描述】:

我有一个包含重复列标题的 CSV 文件,所以我不能使用 Import-Csv 来完成这项工作。标头名称是动态的。我需要获取第三列、第四列和之后的每第四列(例如:从 0 列开始 2、3、7、11、15...)。

我有重复的列名的原因是标题 3 需要与标题 0 相同的名称,以四个为一组。 0 > 3, 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 开始,则为第二列),但我不确定如何获取之后的每第四列(如果从 0 开始,则为第三列)

type "C:\Scripts\File.csv" | % { $_.Split(",") | select -skip 2 -first 1 }

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

【问题讨论】:

  • 有什么原因你不能用Import-Csv-Header 选项手动指定自己的列标题?

标签: powershell


【解决方案1】:

我会重新考虑整个过程并从这个开始:

$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

【讨论】:

  • 这比我知道的要多得多。我正在考虑选择我需要的列并使用 Add-Content 将它们添加到 CSV,但它不会创建新列,而是将所有内容添加到其他数据下方的第一列。
  • 我认为它不会像您想象的那么复杂。如果您发布一些示例数据和预期输出,我会给您一些示例代码。
  • 请注意,如果 .csv 文件使用带引号的标识符并且字段包含逗号,则这将无法正常工作,因为 Import-CsvConvertFrom-Csv 都可以正确处理这些,而 Split(',') 不会。示例:$x = '"1","2,3"'; $x | ConvertFrom-Csv -Header $($x.Split(',')) | ft -a
  • @Bacon Bits - 我假设拆分将基于 OP 在他现在拥有的代码中执行此操作的事实 - $headers = $headers -split ",".
  • 数据不包含引号和额外的逗号。格式化似乎效果不佳,所以我将发布前后数据的屏幕截图。
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
相关资源
最近更新 更多