我正在处理一个大文本文件,我的意思是超过 100 MB 大,我需要遍历特定数量的行,一种子集,所以我正在尝试这个,
$info = Get-Content -Path $TextFile | Select-Object -Index $from,$to
foreach ($line in $info)
{
,,,
但它不起作用。就像它只获取子集中的第一行一样。
我没有找到关于 Index 属性的文档,所以这是可能的还是应该考虑文件大小尝试使用不同的方法?
我正在处理一个大文本文件,我的意思是超过 100 MB 大,我需要遍历特定数量的行,一种子集,所以我正在尝试这个,
$info = Get-Content -Path $TextFile | Select-Object -Index $from,$to
foreach ($line in $info)
{
,,,
但它不起作用。就像它只获取子集中的第一行一样。
我没有找到关于 Index 属性的文档,所以这是可能的还是应该考虑文件大小尝试使用不同的方法?
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 {...}
行是固定长度的吗?如果是这样,您可以通过简单地计算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()
以下对我有用。它提取两行之间的所有内容。
$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
试试这个代码:
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
Get-Content cmdlet 具有 readcount 和 totalcount 参数。我会玩弄这些并尝试对其进行设置,以便将您感兴趣的行分配给一个对象,然后将该对象用于您的循环。