将数组的值添加到 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"
我离 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"