在数组的每个项后附加一个字符串

14
我有一个数组,当我尝试将字符串附加到其中时,该数组会转换为单个字符串。
我有以下数据存储在数组中:
$Str  
451 CAR,-3 ,7 ,10 ,0 ,3 , 20 ,Over: 41  
452 DEN «,40.5,0,7,0,14, 21 ,  Cover: 4  

我想在此实例中添加比赛的星期,例如:

$Str = "Week"+$Week+$Str 

我得到一个字符串:

Week16101,NYG,42.5 ,3 ,10 ,3 ,3 , 19 ,Over 43 102,PHI,-  1,14,7,0,324 ,  Cover 4 103,

当然,我希望追加操作发生在每一行。


为了让观察者更清楚,我建议你重新命名变量,因为名称“str”可能会让人们认为你应该有一个单一的标量字符串变量...只是一个想法! - Simon Catlin
4个回答

14

如果您喜欢使用管道,可以使用Foreach-Object命令 (而非for循环):

$str = "apple","lemon","toast" 
$str = $str | ForEach-Object {"Week$_"}

输出:

Weekapple
Weeklemon
Weektoast

我喜欢这个答案。它更易于阅读,适用于一次性场景。但是对于需要更多控制的较长脚本,我认为我的答案更合适。这取决于应用程序。 - Michael Timmerman
1
我在寻找这种答案,以便将相同的字符串添加到数组的所有元素中! - Unnikrishnan

6

PowerShell v4+的另一个选项

$str = $str.ForEach({ "Week" + $Week + $_ })

4
另一个解决方案,虽然有点晦涩,但快速而简洁。它使用基于正则表达式-replace 运算符和正则表达式'^',该正则表达式匹配每个输入字符串开头的位置,因此有效地将替换字符串添加到每个数组元素的前面(类似地,您可以使用'$'来追加)。
# Sample array.
$array = 'one', 'two', 'three'

# Prepend 'Week ' to each element and create a new array.
$newArray = $array -replace '^', 'Week '

"

$newArray现在包含'第一周','第二周','第三周'

为了展示一个等效的foreach解决方案,它在语法上比for解决方案更简单(但像上面的-replace解决方案一样,不可避免地创建一个新数组):

"
[array] $newArray = foreach ($element in $array) { 'Week ' + $element }

注意:需要使用[array]强制转换以确保结果始终是一个数组;如果没有这样做,如果输入的数组恰好只包含一个元素,PowerShell将原封不动地将该元素的修改副本分配给$newArray,也就是说,不会创建任何数组。
关于您尝试的内容:
“Week”+$Week+$Str 由于+操作符左侧是单个字符串,所以会进行简单的字符串拼接,这意味着$str中的数组被转换为字符串,并默认使用空格字符连接(字符串化)的元素。
下面是一个简化的示例:
PS> 'foo: ' + ('bar', 'baz')
foo: bar baz

解决方案选项:
对于数组的每个元素操作,您需要以下之一: 权衡:
速度: - 基于操作符的解决方案最快,其次是 for/foreach、.ForEach(),最慢的选项是 ForEach-Object。
内存使用: - 只有采用索引访问数组元素的 for 选项才允许对输入数组进行原地更新;所有其他方法都会创建一个新数组。[1]
严格来说,.ForEach() 返回的不是 .NET 数组,而是类型为 [System.Collections.ObjectModel.Collection[psobject]] 的集合,但在 PowerShell 中通常不会有太大区别。

1
很棒的答案,不依赖于循环。 - undefined

2

以下类似代码可以用于在数组中每一行的前面或后面添加文本。

定义数组$str:

$str = "apple","lemon","toast"

$str
apple
lemon
toast

现在可以在文本前添加内容:

for ($i=0; $i -lt $Str.Count; $i++) {
    $str[$i] = "yogurt" + $str[$i]
}

$str
yogurtapple
yogurtlemon
yogurttoast

这适用于在每行前/后添加静态文本。如果需要插入一个可变的变量,可能需要进行一些修改。为了推荐某些内容,我需要看到更多的代码。


我想知道哪个更符合PowerShell,你的回答还是Martin Brandl的回答? - Unnikrishnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接