【问题标题】:Extract text from string to end of document从字符串中提取文本到文档末尾
【发布时间】:2019-02-19 14:56:28
【问题描述】:

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

如果我可以从该行拉到文档末尾的所有内容,我应该能够打开文件。

【问题讨论】:

  • 你是说文件比较小就可以,只需要解决文件大小的问题吗?
  • 哦,抱歉,我不知道我为什么在其中包含该信息。我真的无法在文本编辑器中打开整个文件(超过 1GB)。但我知道我需要的数据在文件的最后 10% 中。所以如果我能生成一个只包含最后 10% 文本的文件,我就能得到我需要的东西。可能值得注意的是,我是一名化学家,对 PowerShell 等不太精通。

标签: powershell


【解决方案1】:

您可以为此使用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()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2018-04-20
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多