获取内容数据块

时间:2017-02-22 17:19:12

标签: file powershell

我有大小约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”之后的任何内容。

2 个答案:

答案 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