String 提取所有无空间字符串

String 提取所有无空间字符串,string,powershell,extract,String,Powershell,Extract,下面显示的试用脚本旨在从文本文件F中提取无空格字符串,并按照找到的顺序将其传递到结果文件Fr,其中每行设置一个字符串。总的来说,它工作得很好,除了在结果文件中可能有跳过的行的行尾,除了我不知道它是否是一个正确停止的脚本,除此之外,最糟糕的是,它需要永远完成它的工作 $fic= "<F>" $ficr="<Fr>" $fics="<Fs>" $cF=(gc $fic -encoding utf8) clc $fics;clc $ficr $Lfic=(gc $f

下面显示的试用脚本旨在从文本文件
F
中提取无空格字符串,并按照找到的顺序将其传递到结果文件
Fr
,其中每行设置一个字符串。总的来说,它工作得很好,除了在结果文件中可能有跳过的行的行尾,除了我不知道它是否是一个正确停止的脚本,除此之外,最糟糕的是,它需要永远完成它的工作

$fic= "<F>"
$ficr="<Fr>"
$fics="<Fs>"
$cF=(gc $fic -encoding utf8)
clc $fics;clc $ficr
$Lfic=(gc $fic).length;
$MPfic=$Lfic-1;$Pfic=0..$MPfic
foreach($x in $Pfic){$llge=((gc $fic)[$x]).length;$mplge=$llge-1;$plge=0..$mplge;foreach($y in $plge)
                       {if($cF[$x][$y] -ne " "){$cF[$x][$y] >> $fics} 
                                               else {if($cF[$x][$y+1] -ne " ")
                                                       {(-join (gc $fics)) >> $ficr;clc $fics}else{while($cF[$x][$y+1] -eq " "){$y=$y+1}}
                                                    }
                       }
                     }
文件
Fr
中应该包含以下内容:

line 1  %
line 2  10
line 3  prog
line 4  axil,
line 5  (les
line 6  prog
line 7  activés)
line 8  %
line 9  début%
line 10 Ce
line 11 qu'il
line 12 faut:
line 13 <<~ZZZ_if_livre_op_prog_LPX.txt~>>
line 14 %
line 15 à
line 16 partir
line 17 du
line 18 mot
line 19 <<~index~>>
第1行%
第2行10
第3行程序
第4行轴,
第5行(les)
第6行程序
第7行(活动)
第8行%
第9行dé但是%
第10行Ce
第11行qu'il
第12行faut:
第13行
第14行%
第15行a
第16行第1部分
第17行du
第18行mot
第19行

您当前的脚本似乎过于复杂。您可以将其简化为(伪代码):

在PowerShell中,可能看起来像:

# read all lines from file
$lines = Get-Content $fic -Encoding utf8

# split into two groups - those that contain whitespace and those that don't
$withSpace,$withoutSpace = $lines.Where({$_ -match '\s'}, 'Split')

# write the lines with whitespace to $fics
$withSpace |Set-Content $fics

# write the lines without whitespace to $ficr
$withoutSpace |Set-Content $ficr

您当前的脚本似乎过于复杂。您可以将其简化为(伪代码):

在PowerShell中,可能看起来像:

# read all lines from file
$lines = Get-Content $fic -Encoding utf8

# split into two groups - those that contain whitespace and those that don't
$withSpace,$withoutSpace = $lines.Where({$_ -match '\s'}, 'Split')

# write the lines with whitespace to $fics
$withSpace |Set-Content $fics

# write the lines without whitespace to $ficr
$withoutSpace |Set-Content $ficr

你只是想把所有的空白都分开

-split (get-content spaces.txt)
为了消除空行,-raw将整个文件读取为一个字符串,而不是每行一个字符串

-split (get-content -raw spaces.txt)

你只是想把所有的空白都分开

-split (get-content spaces.txt)
为了消除空行,-raw将整个文件读取为一个字符串,而不是每行一个字符串

-split (get-content -raw spaces.txt)


如果您真的让事情变得过于复杂,您可能只需要使用cmdlet和a:
Get Content$fic | Select String'^[^]+$'| Set Content$ficr
@iRon非常感谢,非常有价值的信息。如果您真的让事情过于复杂,您可以使用cmdlet和a:
Get Content$fic | Select String'^[^]+$'|设置内容$ficr
@iRon非常感谢,非常有价值的信息。可能我没有正确表述问题。我称之为“无空格字符串”的是放在行中空格之间的元素,如下所示(每个空格都标记为空格),而不是行:ldijfhdSPACE:§!fokjdhjhuySPACE52fo5rd6SPACEyp^$rá0@. 因此,您提出的代码对我很有指导意义,但它并不能满足需要。@LPH您能用一个例子来更新您的帖子吗?说明输入是什么样子的,以及您希望输出是什么样子的?现在还不太清楚是的,我会的。我只是做了你要求的加法。@LPH,啊,那么你基本上只想要非空字段?可能我没有正确表述问题。我称之为“无空格字符串”的是放在行中空格之间的元素,如下所示(每个空格都标记为空格),而不是行:ldijfhdSPACE:§!fokjdhjhuySPACE52fo5rd6SPACEyp^$rá0@. 因此,您提出的代码对我很有指导意义,但它并不能满足需要。@LPH您能用一个例子来更新您的帖子吗?说明输入是什么样子的,以及您希望输出是什么样子的?现在不太清楚是的,我会的。我只是做了你要求的加法。@LPH,啊,那么你基本上只想要非空字段?@LPH它是一个运算符,不是一个参数-整个语句本身就是有效的。你的意思是在将文件路径插入“spaces.txt”位置之后在ISE中执行该命令会在屏幕上显示结果?是的,完美;非常感谢你!速度太快了!如果将-split运算符放在左侧,它将在可变的空白处拆分。@js2010我想我最好告诉您,使用此运算符,空行不会被跳过,而是由输出中的空行渲染;不过,这在我的脚本中并没有问题,我可以解决这个问题。
get content-raw
会解决这个问题。我将更新答案。@LPH它是一个运算符,而不是一个参数-整个语句本身是有效的。您的意思是,在将文件路径插入“spaces.txt”位置后,在ISE中执行该命令会在屏幕上显示结果吗?是的,完美;非常感谢你!速度太快了!如果将-split运算符放在左侧,它将在可变的空白处拆分。@js2010我想我最好告诉您,使用此运算符,空行不会被跳过,而是由输出中的空行渲染;不过,这在我的脚本中并没有问题,我可以解决这个问题。
get content-raw
会解决这个问题。我会更新答案。