Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 按行号分段读取文件_Powershell - Fatal编程技术网

Powershell 按行号分段读取文件

Powershell 按行号分段读取文件,powershell,Powershell,我们有一些报告需要在每条记录中重新格式化某些行的文本(目前是手动完成的),但是,它们位于一个大的文本文件中。每条记录的长度可以是64-70行,但打印时每页只能有一条记录,因此我们需要知道每条记录的长度,以便正确格式化并写入新文件 由于每条记录以关键字开始和结束,我们可以计算它们之间的行数,以了解我们处理的行数,但我们如何从该位置开始读取 例如,第一条记录从第72行开始,长68行。因此,下一条记录将从145行开始(68行,加上页脚关键字和空行)。我们如何从第145行开始,然后读取“x”行数 我曾想

我们有一些报告需要在每条记录中重新格式化某些行的文本(目前是手动完成的),但是,它们位于一个大的文本文件中。每条记录的长度可以是64-70行,但打印时每页只能有一条记录,因此我们需要知道每条记录的长度,以便正确格式化并写入新文件

由于每条记录以关键字开始和结束,我们可以计算它们之间的行数,以了解我们处理的行数,但我们如何从该位置开始读取

例如,第一条记录从第72行开始,长68行。因此,下一条记录将从145行开始(68行,加上页脚关键字和空行)。我们如何从第145行开始,然后读取“x”行数

我曾想做一件事/做一段时间或做一件事/直到,但那似乎不起作用。我使用Do/Until,它要么返回空行,要么一遍遍地重复一行。另外,从特定行开始读取文件也没有帮助

$path = "\somefolder\somefile.txt"
$array = @()
$linecount = 0

#Read the file; this is the Header section
#Number of lines may vary
foreach($line in Get-Content $path)
{
    $linecount++
    If($line -match "End of Header")
    {
        break
    }
    else
    {
        $array += $line
    }
}
这就是我所能做到的。我所做的一切都不会让下一节从行号开始阅读,并从那里继续浏览文件。任何帮助都将不胜感激。

试试以下方法:

Add-Type -AssemblyName System.Collections
Add-Type -AssemblyName System.Text.RegularExpressions

[System.Collections.Generic.List[string]]$content = @()

$inputFile   = 'D:\content.txt'
$outputFile  = 'D:\content1.txt'

$addLines    = $false
$startLine   = 30      # if not needed, set to 0
$lineCounter = 0

foreach($line in [System.IO.File]::ReadLines($inputFile)) {

    $lineCounter++

    if( $line -like '*Begin of Header*' -or $lineCounter -eq $startLine) {
        $addLines = $true
    }
    elseif( $line -like '*End of Header*') {
        break
    }
    elseif( $addLines ) {
        [void]$content.Add( $line )
    }
}

[System.IO.File]::WriteAllLines( $outputFile, $content ) | Out-Null
试试这个:

Add-Type -AssemblyName System.Collections
Add-Type -AssemblyName System.Text.RegularExpressions

[System.Collections.Generic.List[string]]$content = @()

$inputFile   = 'D:\content.txt'
$outputFile  = 'D:\content1.txt'

$addLines    = $false
$startLine   = 30      # if not needed, set to 0
$lineCounter = 0

foreach($line in [System.IO.File]::ReadLines($inputFile)) {

    $lineCounter++

    if( $line -like '*Begin of Header*' -or $lineCounter -eq $startLine) {
        $addLines = $true
    }
    elseif( $line -like '*End of Header*') {
        break
    }
    elseif( $addLines ) {
        [void]$content.Add( $line )
    }
}

[System.IO.File]::WriteAllLines( $outputFile, $content ) | Out-Null

可能会有帮助的是您正在解析的文件的示例。我会的,但它包含敏感和机密信息。我可以删除所有这些内容,但实际查看的内容就不多了。如果是我,我会将整个文件作为多行字符串读入(
Get content$file-raw
),然后在页眉行或页脚行执行RegEx
-split
)。这会将它拆分为多个多行段,您可以通过在新行上拆分来处理每个多行段(我使用
-split'[\r\n]+'
来完成此操作)。您正在解析的文件的示例可能会有所帮助。我会的,但它包含敏感和机密信息。我可以删除所有这些内容,但实际查看的内容就不多了。如果是我,我会将整个文件作为多行字符串读入(
Get content$file-raw
),然后在页眉行或页脚行执行RegEx
-split
)。这会将其拆分为多个多线段,您可以通过在新行上拆分来处理每个线段(我使用
-split'[\r\n]+'
),这正是我想要的。需要进行一些调整,以获得正确的输出方式,我需要它,但其他当场。谢谢大家!@Hinton如果这个答案解决了您的问题,您应该通过勾选问题左侧的绿色复选标记,将其标记为已接受。这有助于未来有同样问题的人找到解决方案,而不必问同样的问题。这正是我一直在寻找的。需要进行一些调整,以获得正确的输出方式,我需要它,但其他当场。谢谢大家!@Hinton如果这个答案解决了您的问题,您应该通过勾选问题左侧的绿色复选标记,将其标记为已接受。这有助于未来有同样问题的人找到解决方案,而不必问同样的问题。