从字符串中提取文本到文档末尾

时间:2019-02-19 14:56:29

标签: powershell

我的文件太大,无法打开。但是,我只需要该文件的最后一部分。有一行包含此字符串的文本:DATA FROM NSERCH= 249

如果我可以将所有内容从该行拖到文档末尾,则应该可以打开文件。

2 个答案:

答案 0 :(得分:2)

您可以使用Get-Content cmdlet并读取行,直到找到您选择作为此起点的字符串为止。

$filename   = 'FULL PATH TO THE TOO LARGE TO OPEN FILE'
$outputPath = 'FULL PATH TO THE OUTPUT.TXT FILE'

$saveit = $false
Get-Content -Path $filename | ForEach-Object {
    # the $_ automatic variable represents a single line of the file
    if ($saveit) { 
        Add-Content -Path $outputPath -Value $_ 
    }
    else {
        $saveit = ($_ -match 'DATA\s+FROM\s+NSERCH=\s+249')
    }
}

下面的代码具有完全相同的功能,但是需要.NET 4.0或更高版本,因此,如果您使用的是PowerShell 3.0或更高版本,则可以使用[System.IO.File]::ReadLines()方法来加快速度:

$filename   = 'FULL PATH TO THE TOO LARGE TO OPEN FILE'
$outputPath = 'FULL PATH TO THE OUTPUT.TXT FILE'

$saveit = $false
foreach ($line in [System.IO.File]::ReadLines($filename)) {
    if ($saveit) { 
        Add-Content -Path $outputPath -Value $line 
    }
    else {
        $saveit = ($line -match 'DATA\s+FROM\s+NSERCH=\s+249')
    }
}

另一个Get-Content替代方案可能是:

$filename   = 'FULL PATH TO THE TOO LARGE TO OPEN FILE'
$outputPath = 'FULL PATH TO THE OUTPUT.TXT FILE'

$saveit = $false
$reader = [System.IO.File]::OpenText($filename)
while (!($reader.EndOfStream)) {
    $line = $reader.ReadLine()
    if ($saveit) { 
        Add-Content -Path $outputPath -Value $line 
    }
    else {
        $saveit = ($line -match 'DATA\s+FROM\s+NSERCH=\s+249')
    }
}
$reader.Close()

答案 1 :(得分:1)

更新:这不是直接答案,而是仅搜索部分文件的解决方法:仅检查最后几行。如果需要,可以通过增加行数来重复进行此操作。

here中描述的Get-Content -Tail <number of lines>参数指定从文件或其他项目末尾开始的行数。您可以使用它来减少输入。此参数是在PowerShell 3.0中引入的。