使用PowerShell v2从大文本文件中获取行的子集

时间:2013-01-16 05:36:27

标签: powershell text-files

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

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

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

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

5 个答案:

答案 0 :(得分:8)

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 {...}

答案 1 :(得分:4)

行是固定长度的吗?如果是,您可以通过简单地计算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 :(得分:0)

试试这段代码:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

$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