首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell替换循环(如此接近),但只影响数组中的最后一个对象

PowerShell替换循环(如此接近),但只影响数组中的最后一个对象
EN

Stack Overflow用户
提问于 2021-03-11 17:47:35
回答 2查看 160关注 0票数 0

我有这样一个txt文件,但如果列表列中的每个条目中有7个或更少的字符(包括包装双引号),则需要添加一个选项卡,然后将其替换为文件,以使其格式美观(此文件只能是txt,格式为txt,以当前格式等):

当前

代码语言:javascript
复制
List:       ID:

"izzak" "QWERTY654POI"
"swortz23"  "00ERTY654POI"
"campingou" "QWERTY454POI"
"dark1est"  "QWERTY654POI"
"muffin0"   "QWERTY654POI"
"parly" "25ERTY654POI"
"ggghsle"   "QWE78Y654POI"
"fie4lder"  "QWERTY654POI"
"67532" "QWERTY654POI"
"urquhart"  "11ERTY654POI"
"bbs3"  "QWERTY654POI"

需要像这样:

代码语言:javascript
复制
List:       ID:

"izzak"     "QWERTY654POI"
"swortz23"  "00ERTY654POI"
"campingou" "QWERTY454POI"
"dark1est"  "QWERTY654POI"
"muffin0"   "QWERTY654POI"
"parly"     "25ERTY654POI"
"ggghsle"   "QWE78Y654POI"
"fie4lder"  "QWERTY654POI"
"67532"     "QWERTY654POI"
"urquhart"  "11ERTY654POI"
"bbs3"      "QWERTY654POI"
代码语言:javascript
复制
$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"

结果如下所示(最后一行将被标签,但没有其他选项):

代码语言:javascript
复制
"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

EN

回答 2

Stack Overflow用户

发布于 2021-03-11 18:55:33

如果它只是处理最后一行,那么这意味着我们并不是在保存我们正在执行的for-每个循环中所做的工作。

因为我们没有保存它,所以只有要处理的最后一行才会被更新。

让我们看看你的forEach

代码语言:javascript
复制
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,在遍历循环的过程中逐行有效地修复文件。

代码语言:javascript
复制
#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,保留以前的编辑。我没有与您相同的源文件来重新创建这个文件,但是它应该可以工作。

票数 1
EN

Stack Overflow用户

发布于 2021-03-11 20:19:23

通过使用hashtable,它非常有用,并可能在今后的工作中派上用场

代码语言:javascript
复制
  $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.txt

txt文件的结果:

代码语言:javascript
复制
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方法删除多余的空格条目。

代码语言:javascript
复制
([string[]](Get-Content $path\result.txt)) | % {$_.Remove(10,20)}

或替换标题并将其再次保存在txt文件中。

代码语言:javascript
复制
([string[]](Get-Content $path\result.txt)) | % {$_.Replace("Name", "List:")} |  % {$_.Replace("Value", "Id:")}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66587803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档