我有这样一个txt文件,但如果列表列中的每个条目中有7个或更少的字符(包括包装双引号),则需要添加一个选项卡,然后将其替换为文件,以使其格式美观(此文件只能是txt,格式为txt,以当前格式等):
当前
List: ID:
"izzak" "QWERTY654POI"
"swortz23" "00ERTY654POI"
"campingou" "QWERTY454POI"
"dark1est" "QWERTY654POI"
"muffin0" "QWERTY654POI"
"parly" "25ERTY654POI"
"ggghsle" "QWE78Y654POI"
"fie4lder" "QWERTY654POI"
"67532" "QWERTY654POI"
"urquhart" "11ERTY654POI"
"bbs3" "QWERTY654POI"需要像这样:
List: ID:
"izzak" "QWERTY654POI"
"swortz23" "00ERTY654POI"
"campingou" "QWERTY454POI"
"dark1est" "QWERTY654POI"
"muffin0" "QWERTY654POI"
"parly" "25ERTY654POI"
"ggghsle" "QWE78Y654POI"
"fie4lder" "QWERTY654POI"
"67532" "QWERTY654POI"
"urquhart" "11ERTY654POI"
"bbs3" "QWERTY654POI"$where = Get-Content C:\Users\me\Desktop\info.txt
#pull any text on each line before a tab (gets first column if wrapped in double quotes)
$pattern = '(".*")(?:\t)'
$arrayoutput = (Get-Content -Path "C:\Users\me\Desktop\info.txt" | Select-String $pattern -AllMatches | ForEach-Object { $_.Matches.Value }).Trim()
foreach ($product in $arrayoutput) {
if ($product.length -le 7) {
$addtab = "$product"+"`t"
$endresult = $where.replace($product, $addtab)
}
}
$endresult | Set-Content -Path "C:\Users\me\Desktop\info.txt"结果如下所示(最后一行将被标签,但没有其他选项):
"izzak" "QWERTY654POI"
"swortz23" "00ERTY654POI"
"campingou" "QWERTY454POI"
"dark1est" "QWERTY654POI"
"muffin0" "QWERTY654POI"
"parly" "25ERTY654POI"
"ggghsle" "QWE78Y654POI"
"fie4lder" "QWERTY654POI"
"67532" "QWERTY654POI"
"urquhart" "11ERTY654POI"
"bbs3" "QWERTY654POI"如果列表列中的多个条目小于或等于7(计算其周围的双引号;否则为5),我的代码将只向最后一个条目添加一个选项卡。
有人对此有任何想法,或者如何迭代每个数组条目,然后用新条目替换旧条目?
编辑:每一行都是在两列之间分隔的单个tab。
发布于 2021-03-11 18:55:33
如果它只是处理最后一行,那么这意味着我们并不是在保存我们正在执行的for-每个循环中所做的工作。
因为我们没有保存它,所以只有要处理的最后一行才会被更新。
让我们看看你的forEach。
foreach ($product in $arrayoutput) {
if ($product.length -le 7) {
$addtab = "$product"+"`t"
$endresult = $where.replace($product, $addtab)
}
}这是每次重新保存$endResult,并将其保存为$where值,当您将一个值替换为另一个值时,这意味着每次您通过这个过程替换了一行,然后在下一次和下一次再次这样做。
您没有保留更改,因为每次都使用针对$where的一个更改操作重新保存$where。,这是bug.
相反,我们只需进行两次更改就可以使其工作。首先,在脚本开始时,我们将复制所有的$where,这是原始的未经编辑的文本文件,并将其存储为$endResult。然后,我们修改循环以编辑$endResult,在遍历循环的过程中逐行有效地修复文件。
#store the unedited file as `$endResult`
$endresult = $where
foreach ($product in $arrayoutput) {
if ($product.length -le 7) {
$addtab = "$product"+"`t"
#as we progress through the loop, we are cleaning up the endresult file line by line
$endresult = $endresult.replace($product, $addtab)
}
}这将在您运行时更新$endResult,保留以前的编辑。我没有与您相同的源文件来重新创建这个文件,但是它应该可以工作。
发布于 2021-03-11 20:19:23
通过使用hashtable,它非常有用,并可能在今后的工作中派上用场
$clear = (Get-content "$path\source.txt").Split(' ') | % { $_.Split(' ')} | ? {$_ -notcontains [string]::Empty}; $hash = @{}; For($i = 0;$i -lt $clear.count; $i=$i+2){$hash.Add($clear[$i], $clear[$i+1])}; $hash >> $path\result.txttxt文件的结果:
Name Value
---- -----
"urquhart" "11ERTY654POI"
"campingou" "QWERTY454POI"
"muffin0" "QWERTY654POI"
"parly" "25ERTY654POI"
"ggghsle" "QWE78Y654POI"
"izzak" "QWERTY654POI"
"bbs3" "QWERTY654POI"
"fie4lder" "QWERTY654POI"
"swortz23" "00ERTY654POI"
"dark1est" "QWERTY654POI"
"67532" "QWERTY654POI"现在您可以根据需要编辑此表,例如,使用Remove方法删除多余的空格条目。
([string[]](Get-Content $path\result.txt)) | % {$_.Remove(10,20)}或替换标题并将其再次保存在txt文件中。
([string[]](Get-Content $path\result.txt)) | % {$_.Replace("Name", "List:")} | % {$_.Replace("Value", "Id:")}https://stackoverflow.com/questions/66587803
复制相似问题