有几种方法可以解决这个问题。大楼Mathews helpful answer:
$InCsv = 'C:\Users\Inspiron\Desktop\base.csv'
$OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
$Props = "year","date of birth","state of origin"
$InCsv = Import-Csv $InCsv
$rangeselect = $InCsv[700..900] # You could use variables here too...
$rangeselect |
Select-Object $Props |
Export-Csv -Path $OutCsv -NoTypeInformation
这需要选择您想要的属性并将它们重新导出到新的 CSV 文件的附加步骤。
注意:这不太可能,但如果您正在处理非常大的文件,这种方法可能会出现内存问题。它预先将整个文件读入内存,并将其存储在$csv 变量中。如果系统受内存限制,也可能发生这种情况,但这种情况很少见。
从技术上讲,您不需要分配 $rangeselect 变量,您可以直接在 Import-Csv 命令上使用范围运算符“..”,例如:
(Import-Csv $InCsv)[700..900] |
Select-Object $Props |
Export-Csv -Path $OutCsv -NoTypeInformation
这里,(..) 在引用之前首先完成了所有 CSV 数据的读取,所以它的工作原理应该差不多。
如果您想在初始样本的基础上进行构建。其优点是只读取前 1000 行,很可能绕过任何内存限制:
$InCsv = 'C:\Users\Inspiron\Desktop\base.csv'
$OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
$Props = "year","date of birth","state of origin"
$Skip = 700
$First = 200
Get-Content -First 1000 $InCsv |
ConvertFrom-Csv |
Select-Object -Skip $Skip -First $First -Property $Props |
Export-Csv -Path $OutCsv -NoTypeInformation
这实际上是一个带有一些便利变量的单行代码。它利用了Select-Object 中的参数。请注意,它也只返回您要求的属性,因此将输出一个仅包含该数据的新 CSV 文件。
您也可以组合这些方法,因为Select-Object 允许-Skip、-First 和-Last 参数用于一些基本的初始过滤。这可能看起来像:
$InCsv = 'C:\Users\Inspiron\Desktop\base.csv'
$OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
$Props = "year","date of birth","state of origin"
$Skip = 699
$First = 200
Import-CSv $InCsv |
Select-Object -Skip 700 -First 200 -Property $Props |
Export-Csv -Path $OutCsv -NoTypeInformation
在此示例中,您可能必须使用边界。但是,它实际上仍然是单线的,并且有可能获得您正在寻找的东西。
注意:Select-Object 可以告诉管道左侧的命令停止发送数据。但是,我不确定每个 cmdlet 都能正确反应,因此与 Get-Content 方法相比,性能可能会有所不同。这可能仅在您处理更大的文件时才重要,否则我会采用任何被认为更具可读性和/或可维护性的方法......