我的任务是获取类似于以下内容的文本文件的内容...
一条典型的线
典型线
一行长达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搜索两天后,我基本上已经放弃了,不在乎是否将单词分割成两半。
答案 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对我不起作用),但确实使我能够朝另一个方向进行研究。