Powershell 按行号分段读取文件
我们有一些报告需要在每条记录中重新格式化某些行的文本(目前是手动完成的),但是,它们位于一个大的文本文件中。每条记录的长度可以是64-70行,但打印时每页只能有一条记录,因此我们需要知道每条记录的长度,以便正确格式化并写入新文件 由于每条记录以关键字开始和结束,我们可以计算它们之间的行数,以了解我们处理的行数,但我们如何从该位置开始读取 例如,第一条记录从第72行开始,长68行。因此,下一条记录将从145行开始(68行,加上页脚关键字和空行)。我们如何从第145行开始,然后读取“x”行数 我曾想做一件事/做一段时间或做一件事/直到,但那似乎不起作用。我使用Do/Until,它要么返回空行,要么一遍遍地重复一行。另外,从特定行开始读取文件也没有帮助Powershell 按行号分段读取文件,powershell,Powershell,我们有一些报告需要在每条记录中重新格式化某些行的文本(目前是手动完成的),但是,它们位于一个大的文本文件中。每条记录的长度可以是64-70行,但打印时每页只能有一条记录,因此我们需要知道每条记录的长度,以便正确格式化并写入新文件 由于每条记录以关键字开始和结束,我们可以计算它们之间的行数,以了解我们处理的行数,但我们如何从该位置开始读取 例如,第一条记录从第72行开始,长68行。因此,下一条记录将从145行开始(68行,加上页脚关键字和空行)。我们如何从第145行开始,然后读取“x”行数 我曾想
$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如果这个答案解决了您的问题,您应该通过勾选问题左侧的绿色复选标记,将其标记为已接受。这有助于未来有同样问题的人找到解决方案,而不必问同样的问题。