我有大小约3GB的大文件。这些文件的顶部和底部都有信息部分,这些信息行的数量因文件而异。 即
infostart1
infostart2
START-OF-DATA
line1
line2
...
...
...
linen
END-OF-DATA
infoend1
infoend2
等。 我正在尝试创建一个只复制START-OF-DATA和END-OF-DATA之间的行的数据文件。
$DataStartLineNumber = (Select-String $File -Pattern 'START-OF-DATA' | Select-Object -ExpandProperty 'LineNumber')[0]
$DataEndLineNumber = (Select-String $File -Pattern 'END-OF-DATA' | Select-Object -ExpandProperty 'LineNumber')[-1]
我试过了:
Get-Content -Path $File | Select-Object -Index ($DataStartLineNumber..($DataEndLineNumber-2)) | Add-Content $Destination
但由于内存使用而导致Get-Content失败。
我也尝试过:
Get-Content -Path $File -ReadCount 10000 | Select-Object -Index ($DataStartLineNumber..$DataEndLineNumber) | Add-Content $Destination
但是,这不能按预期工作。
我不想逐行阅读,因为它需要太长时间。 有没有办法从文件中读取数据块并应用过滤器来消除“START-OF-DATA”之前和“END-OF-DATA”之后的任何内容。 或按原样复制文件,然后以有效的方式删除“START-OF-DATA”之前和“END-OF-DATA”之后的任何内容。
答案 0 :(得分:1)
作为Matt mentions in the comments,您可以使用StreamReader
自行逐行阅读文件。
我建议用一个循环“先跳过去”,然后用另一个循环收集相关的行:
$Reader = New-Object System.IO.StreamReader 'C:\Path\to\file.txt'
$StartBoundary = 'START-OF-DATA'
$EndBoundary = 'END-OF-DATA'
# Skip ahead to the starting boundary
while(-not($Reader.EndOfStream) -and ($line = $Reader.ReadLine()) -notmatch $StartBoundary){ <#nothing to be done here#> }
# Output all lines until we hit the end boundary
$lines = while(-not($Reader.EndOfStream) -and ($line = $Reader.ReadLine()) -notmatch $EndBoundary){ $line }
# $lines now contain the data
答案 1 :(得分:0)
我不知道你的记忆问题是否会得到解决,但试试这个
info.plist