【发布时间】:2019-11-02 01:29:14
【问题描述】:
我有一些具有相同标题的大型 CSV 文件 (500MB+),我想在过滤机器类型 = 工作站后将其合并到一个合并文件中。如何将特定列标题“machine_type”过滤为“工作站”。下面的代码可以工作,但会创建包含太多行数据的 CSV 文件。感谢帮助。 Import-Csv 给了我“System.OutofMemoryException”异常。
$inputFolder = c:\change\imput
$outputFile = 'C:\Change\filtered.csv'
$writer = New-Object IO.StreamWriter ($outputFile, $false)
Get-ChildItem $inputFolder -File | Where-Object {
$_.Extension -eq '.csv'
} | ForEach-Object {
$reader = New-Object IO.StreamReader ($_.FullName)
if (-not $headerWritten) {
# copy header line to output file once
$writer.WriteLine($reader.ReadLine())
$headerWritten = $true
} else {
# discard header line
$reader.ReadLine()
}
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
$fields = $line -split ','
#if ($line -match 'Workstation' ) {
$writer.WriteLine($line)
#}
}
$reader.Close()
$reader.Dispose()
}
$writer.Close()
$writer.Dispose()
【问题讨论】:
-
$line -split ','将创建一个数组并存储在$fields中。只需使用与您想要的数据相对应的正确索引,例如$fields[0]或$fields[2]. -
"Too many row data" => 你能举一个不应该出现在输出中的行的例子吗?
-
$line = $reader.ReadLine() $fields = $line -split ',' if ($fields[6] -match 'workstation' ) { $writer.WriteLine($line) }这可行,但 csv 文件的写入不会在每个 csv 行数据之后截断,输出列号延伸到“IVW”。我如何确保 $writer.WriteLine($line) 截断到下一行。
-
奇怪。听起来 .ReadLine() 没有拿起行尾。如果您读取一行,并将其原封不动地写入控制台而不是文件,是否会出现同样的问题?
标签: powershell csv out-of-memory