如何使用PowerShell选择无头csv文件的前10列?

时间:2015-04-22 11:25:15

标签: powershell csv

我有一个名为test.csv($ testCSV)的CSV文件。 此文件中有许多列,但我只想选择前10列并将这10列放入另一个CSV文件中。 请注意,我没有任何列标题,因此无法根据列名选择列。

以下代码行将获得该文件的前10行:

$first10Rows = Get-Content $testCSV | select -First 10

但是我需要前10个列的所有数据,我很难找到解决方案。

我还看了一下拆分文件并尝试按如下方式返回第一列:

$split = ( Get-Content $testCSV) -split ','
$FirstColumn = $split[0]

我原本希望$ split [0]会返回整个第一列,但它只会返回文件中的第一个字段。

非常感谢您解决此问题的任何帮助。

提前致谢。

****** ****** UPDATE

我使用vonPryz下面回答的方法来解决这个问题,即:

Import-Csv -Delimiter "," -Header @("a","b","c") -Path $testCSV  | Select a,b

但是我现在也尝试通过添加额外的代码来仅导入列b不为空的CSV文件:

Import-Csv -Delimiter "," -Header @("a","b","c") -Path $testCSV  | Select a,b | where b -notmatch $null

我需要这样做来加速脚本,因为有数万行,其中列b为空,我不需要导入这些行。 但是,上面的代码不返回任何数据,这意味着代码必须是错误的,或者认为字段b不为空。文本文件的2行示例为:

1,2,3
X ,,ž

我只想要第二列被占用的行。

我希望我已经一次又一次地解释,任何帮助都会受到赞赏。

******************* ANSWER ********************

Import-Csv -Delimiter "," -Header @("a","b","c") -Path $testCSV | Select a,b | Where-Object { $_.b -ne '' }

谢谢!

2 个答案:

答案 0 :(得分:4)

缺少列标题没问题。 cmdlet Import-CSV可以使用-Header开关指定标头。假设测试数据保存为C:\ temp \ headerless.csv并包含

val11,val12,val13,val14
val21,val22,val23,val24
val31,val32,val33,val34

将其导入为CSV非常简单:

Import-Csv -Delimiter "," -Header @("a","b","c","d") -Path C:\temp\headerless.csv

#Output
a     b     c     d
-     -     -     -
val11 val12 val13 val14
val21 val22 val23 val24
val31 val32 val33 val34

仅选择列ab也不难:

Import-Csv -Delimiter "," -Header @("a","b","c","d") -Path C:\temp\headerless.csv | select a,b | ft -auto

#Output    
a     b
-     -
val11 val12
val21 val22
val31 val32

答案 1 :(得分:0)

首先,我想提一下vonPryz's answer是处理这个问题的绝佳方式。我只是想谈谈你想要做什么以及为什么它不起作用。

你有正确的想法。您在逗号上拆分数据。但是你没有在每一行都这样做。只是作为一个整体的文件,这是你的困境的来源。

Get-Content $testCSV | ForEach-Object{
    $split = $_ -split ","
    $FirstColumn = $split[0]
}

这将分别拆分每一行,然后您可以填充$FirstColumn变量。