【问题标题】:Get a subset of lines from a big text file using PowerShell v2使用 PowerShell v2 从大文本文件中获取行的子集
【发布时间】:2012-12-30 09:26:02
【问题描述】:

我正在处理一个大文本文件,我的意思是超过 100 MB 大,我需要遍历特定数量的行,这是一种子集,所以我正在尝试这个,

$info = Get-Content -Path $TextFile | Select-Object -Index $from,$to
foreach ($line in $info)
{
,,,

但它不起作用。这就像它只获取子集中的第一行。

我没有找到关于 Index 属性的文档,所以这可能吗?或者我应该尝试使用不同的方法来考虑文件大小?

【问题讨论】:

    标签: powershell text-files


    【解决方案1】:

    行的长度是固定的吗?如果是,您可以通过简单地计算offset*row length 并使用.Net FileStream.Seek() 之类的东西来寻找所需的位置。如果不是,您所能做的就是逐行读取文件。

    要提取行 m、n,请尝试类似

    # Open text file
    $reader = [IO.File]::OpenText($myFile)
    $i=0
    # Read lines until there are no lines left. Count the lines too
    while( ($l = $reader.ReadLine()) -ne $null) {
        # If current line is within extract range, print it
        if($i -ge $m -and $i -le $n) {
            $("Row {0}: {1}" -f $i, $l)
        }
        $i++
        if($i -gt $n) { break } # Stop processing the file when row $n is reached.
    }
    # Close the text file reader
    $reader.Close()
    $reader.Dispose()
    

    【讨论】:

    • 不幸的是,它们的长度不是固定的。谢谢。
    【解决方案2】:
    PS> help select -param index
    
    -Index <Int32[]>
        Selects objects from an array based on their index values. Enter the indexes in a comma-separated list.
    
        Indexes in an array begin with 0, where 0 represents the first value and (n-1) represents the last value.
    
        Required?                    false
        Position?                    named
        Default value                None
        Accept pipeline input?       false
        Accept wildcard characters?  false
    

    根据上述情况,'8,13' 只会得到两行。您可以做的一件事是传递一个数字数组,您可以使用范围运算符:

    Get-Content -Path $TextFile | Select-Object -Index (8..13) | Foreach-Object {...}
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

      Select-String $FilePath -pattern "FromHere" | Out-Null
      
      $FromHereStartingLine = Select-String $FilePath -pattern "FromHere" | Select-Object LineNumber
      
      $UptoHereStartingLine = Select-String $FilePath -pattern "UptoHere" | Select-Object LineNumber
      
      for($i=$FromHereStartingLine.LineNumber; $i -lt $UptoHereStartingLine.LineNumber; $i+=1)
      {
          $HoldInVariable += Get-Content -Path $FilePath | Foreach-Object { ($_  -replace "`r*`n*","") } | Select-Object -Index $i
      }
      
      Write-Host "HoldInVariable : " $HoldInVariable
      

      【讨论】:

        【解决方案4】:

        Get-Content cmdlet 具有 readcount 和 totalcount 参数。我会玩弄这些并尝试对其进行设置,以便将您感兴趣的行分配给一个对象,然后将该对象用于您的循环。

        【讨论】:

          【解决方案5】:

          以下内容对我有用。 它提取两行之间的所有内容。

          $name     = "MDSinfo"
          $MDSinfo  = "$PSScriptRoot\$name.txt" #create text file
          $MDSinfo  = gc $MDSinfo
          
          $from =  ($MDSinfo | Select-String -pattern "sh feature" | Select-Object LineNumber).LineNumber
          $to =  ($MDSinfo  | Select-String -pattern "sh flogi database " | Select-Object LineNumber).LineNumber
          
          $i = 0
          $array = @()
          foreach ($line in $MDSinfo)
          {
          foreach-object { $i++ }
              if (($i -gt $from) -and ($i -lt $to))
              {
              $array += $line      
              }
          }
          $array
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-28
            • 1970-01-01
            • 2011-01-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-02
            • 1970-01-01
            相关资源
            最近更新 更多