将数组的值添加到 csv 文件中的特定位置

Add values of array to specific place in csv file

我离 PowerShell 专家还很远,所以我会尽力在这里解释。

我能够添加一列,但现在我想使用单独的脚本在一列(已经存在)中添加内容。

例如,以下 CSV 文件:

WhenToBuyThings,ThingsToBuy
BuyNow         ,Bed
BuyNow         ,Desk
BuyNow         ,Computer
BuyNow         ,Food
BuyLater       ,
BuyLater       ,
BuyLater       ,

我有数组:

$BuyStuffLater = "Books","Toys","ShinnyStuff"

所以文件的最终结果应该是这样的

BuyNow         ,Bed
BuyNow         ,Desk
BuyNow         ,Computer
BuyNow         ,Food
BuyLater       ,Books
BuyLater       ,Toys
BuyLater       ,ShinnyStuff

任何有关如何在代码中执行此操作的帮助将不胜感激。另外,我们不能使用分隔符“,”。因为在真实的脚本中一些值会有逗号。

我也是 powershell 的新手。这是我发现的。这将搜索并 returns 所有适合的行。我不确定它是否可以管道。

$BuyStuffLater = "Books","Toys","ShinnyStuff"
$x = 0
Get-Content -Path .\mydata.txt | select-string -pattern "BuyLater" #searches and displays
# Im not sure about this piping. (| foreach {$_ + $BuyStuffLater[$x];$x++} | Set-Content .\outputfile.csv)

这个过滤器可以工作,但我仍然需要在管道上工作。其他答案可能更好。

折腾了几个小时搞定了...

$myArray = "Books","Toys","ShinnyStuff"

$i = 0
Import-Csv "C:\Temp\test.csv" | 
ForEach-Object {if($_.WhenToBuyThings -eq "BuyLater"){$_.ThingsToBuy = $myArray[$i];$i++}return $_} |
Export-Csv C:\Temp\testtemp.csv -NoTypeInformation

现在一切都很好...

我看不出有必要遍历每个对象来查看它是 WhenToBuyThings 还是 "BuyLater"。如果您 运行 多次通过添加到列表中,那么您正在做的任何事情都可能有害。它可以删除你以前想要的东西。如果 "Kidney Dialysis Machine" 在 WhenToBuyThings 下被列为 "BuyLater",那么您将覆盖它并带来可怕的后果。

我们可以做的是构建两个列表并合并到新的 csv 文件中。第一个列表是您的原始文件减去 "BuyLater" 有空白 ThingsToBuy 的任何条目。第二个列表是根据您的 $BuyStuffLater 构建的对象数组。将这些列表加在一起并导出。

此外,使用 Export-CSV 时无需担心使用逗号分隔符。引用数据,因此数据中的逗号不会影响数据结构。如果这仍然是一个问题,您可以使用 -Delimiter ";"。我在您的回答中注意到您也没有尝试解释逗号(根据我刚才所说的,这并不重要)。

$path = "C:\Temp\test.csv"
$ListOfItemsToBuy = "Books","Toys","ShinnyStuff: Big, ShinyStuff"
$BuyStuffLater = $ListOfItemsToBuy | ForEach-Object{
    [pscustomobject]@{
        WhenToBuyThings = "BuyLater"
        ThingsToBuy = $_
    }
}
$CurrentList = Import-Csv $path |  Where-Object{$_.WhenToBuyThings -ne "BuyLater" -and ![string]::IsNullOrWhiteSpace($_.ThingsToBuy)}
$CurrentList + $BuyStuffLater | Export-Csv $path -NoTypeInformation

因为你有 3.0,我们可以使用 [pscustomobject]@{} 非常容易地构建新对象。只需将两个数组相加并导出回原始文件即可将它们组合在一起。

您应该注意到我使用了稍微不同的输入数据。一个包括一个逗号。我这样做是为了让您看到输出文件的样子。

"BuyLater","Books"
"BuyLater","Toys"
"BuyLater","ShinnyStuff: Big, ShinyStuff"