如何在Powershell中分割大于X的文本文件的行?

时间:2018-07-02 17:48:25

标签: powershell split

我的任务是获取类似于以下内容的文本文件的内容...

  

一条典型的线
  典型线
  一行长达5,000个字符......
  典型线
  行长30,000个字符......................

然后在$ x个字符(可能是2056个字符)处分割极长的行,这样看起来就像...

  

一条典型的线
  典型线
  一行最长为2056个字符
  一行最长为2056个字符
  一行最长为2056个字符
  典型线
  一行最长为2056个字符
  剩下的30,000个字符行...等等。

我不知道自己在做什么,这是我最好的猜测:

$originalfile = "C:\test\file.txt"
$output = "C:\test\output.txt"

foreach($line in Get-Content $originalfile){
    if ($line.length -gt 2056){
        $line -split ... ???
    } else {
        $line | out-file -Append $output
    }
}

我尝试了发现的这个示例:

(Get-Content $originalfile) -join " " -split '(.{2056,}?[ |$])' | Where-Object{$_} | out-file $output

...但是我永远无法使输出正常工作,它只是将其放在一个长字符串中,但确实在2056年将它们拆分了。

  

一条典型线一条典型线A线为5,000
  字符长............ A典型行A行
  是30,000个字符长。

在一个理想的世界中,我会尝试在一个空间上分割,但是经过Google搜索两天后,我基本上已经放弃了,不在乎是否将单词分割成两半。

2 个答案:

答案 0 :(得分:2)

获取控制台宽度,并每width个字符添加一个换行符(这不考虑空格):

# Really long string from whatever command
$mySuperLongOutputString = "SOMETHING REALLY LONG, LONGER THAN THIS"

# Get the current console width
$consoleWidth = $Host.UI.RawUI.WindowSize.Width

# For loop to iterate over each intended line in the string
for( $i = $consoleWidth; $i -lt $mySuperLongOutputString.Length; $i += $consoleWidth ) {
  # Insert string at the end of the console output
  $mySuperLongOutputString = $mySuperLongOutputString.Insert( $i, "`r`n" )

  # Bump the counter by two to skip counting the additional newline characters
  $i += 2
}

控制台宽度等于缓冲区的列数。

答案 1 :(得分:0)

我确实最终使它开始工作(大部分)。它确实将第一个单词分成了一行,但我可能只需要稍微调整一下正则表达式即可。

foreach($line in Get-Content $originalfile){
    if ($line.length -gt 2056){
        $linearray = [regex]::split($line, '(.{2000}\s)') 
        for ($i=0; $i -lt $linearray.length; $i++) {
            $linearray[$i] | out-file -Append $output
        }
        $linearray=@()
    } else {
        $line | out-file -Append $output
    }
}

道歉,我一开始没有很好地解释这个问题,我的大脑并不适应这种情况。 谢谢Bender的回答,尽管我无法使它起作用。我猜是因为文本文件位于数组中(.insert对我不起作用),但确实使我能够朝另一个方向进行研究。