While循环不会产生可以在流水线中继续的输出。我需要处理一个大的(很多GiB)文件。在这个微不足道的例子中,我想提取第二个字段,对它进行排序,然后只获取唯一值。我对While循环没有什么了解,并通过管道推动事物?While循环不产生流水线输出
在* NIX世界,这将是一个简单的:
cut -d "," -f 2 rf.txt | sort | uniq
在PowerShell中,这将是不是很简单。
源数据。
PS C:\src\powershell> Get-Content .\rf.txt
these,1,there
lines,3,paragraphs
are,2,were
脚本。
PS C:\src\powershell> Get-Content .\rf.ps1
$sr = New-Object System.IO.StreamReader("$(Get-Location)\rf.txt")
while ($line = $sr.ReadLine()) {
Write-Verbose $line
$v = $line.split(',')[1]
Write-Output $v
} | sort
$sr.Close()
输出。
PS C:\src\powershell> .\rf.ps1
At C:\src\powershell\rf.ps1:7 char:3
+ } | sort
+ ~
An empty pipe element is not allowed.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : EmptyPipeElement
将导入-CSV表现得像获取内容,并尝试将整个文件读入内存?如果是这样,那将不会处理大文件。 – lit
@Liturgist我的理解是'Get-Content'(当没有'-Raw'开关时调用)不会将整个文件读入内存。如果你看到了这种行为,那很可能是因为你把它管道到'Sort-Object'('sort'是后者的别名)。看到我的答案为什么。 – briantist
对延迟回复表示歉意。 'Import-Csv'将一次读取一行文件。你不需要担心做一个单独的'Get-Content'。 https://technet.microsoft.com/library/2a767ced-0fc9-4896-a8f0-2c5bdee49910(v=wps.630).aspx – Nasir