将数组的值添加到csv文件

时间:2015-12-13 02:13:22

标签: powershell powershell-v3.0

我远没有成为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

任何有关如何在代码中执行此操作的帮助将非常感激。此外,我们无法使用分隔符","。因为在真实的脚本中,某些值会有逗号。

3 个答案:

答案 0 :(得分:1)

经过几个小时的摆弄后我得到了它......

$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

一切都很好......

答案 1 :(得分:0)

我也是PowerShell的新手。这是我发现的。这将搜索并返回所有适合的行。我不确定它能不能管道。

$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)

这个过滤器可以工作,但我仍然需要处理管道。另一个答案可能会更好。

答案 2 :(得分:0)

我没有看到迭代每个对象以查看它是WhenToBuyThings是“BuyLater”的要点。如果你运行多次传递添加到列表中,那么你正在做的事情可能是有害的。它可以删除你想要的以前的东西。如果“肾透析机”在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"