将列添加到 CSV Windows PowerShell
Posted
技术标签:
【中文标题】将列添加到 CSV Windows PowerShell【英文标题】:Add Column to CSV Windows PowerShell 【发布时间】:2013-06-05 23:58:15 【问题描述】:我有一个相当标准的带有标题的 csv 文件,我想添加一个新列并将所有行设置为相同的数据。
原文:
column1, column2
1,b
2,c
3,5
之后
column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue
如果有人能指出我正确的方向,那我找不到任何东西。抱歉,对 Power Shell 很陌生。
【问题讨论】:
是否有以编程方式生成 column1(序列号)的代码片段? 【参考方案1】:这是使用计算属性的一种方法:
Import-Csv file.csv |
Select-Object *,@Name='column3';Expression='setvalue' |
Export-Csv file.csv -NoTypeInformation
您可以在此处找到更多关于计算属性的信息:http://technet.microsoft.com/en-us/library/ff730948.aspx。
简而言之,您导入文件,将内容通过管道传输到 Select-Object
cmdlet,选择所有现有属性(例如“*”),然后添加一个新属性。
【讨论】:
谢谢你。真的很感激。 嗨,很抱歉恢复这篇旧帖子,但导出到相同文件名时我得到一个空文件。当我导出到与原始名称不同的文件时,它工作正常。发生这种情况有什么原因吗? 这似乎与 Levy 的另一个 answer 有关,其中相同的文件用于读取和写入。只需将第一行括在括号中,就可以开始了! =) 将第一行放在括号中对我不起作用。【参考方案2】:ShayLevy 的回答也适用于我!
如果您不想为每个对象提供一个值,但代码会更简单...
Import-Csv file.csv |
Select-Object *,"column3" |
Export-Csv file.csv -NoTypeInformation
【讨论】:
嗨,很抱歉恢复这篇旧帖子,但导出到相同文件名时我得到一个空文件。当我导出到与原始名称不同的文件时,它工作正常。发生这种情况有什么原因吗?【参考方案3】:创建一个没有任何内容的 csv 文件
$csv >> "$PSScriptRoot/dpg.csv"
定义 csv 文件的路径。这里 $psscriptroot 是脚本的根目录
$csv = "$PSScriptRoot/dpg.csv"
现在添加列
$csv | select vds, protgroup, vlan, ports | Export-Csv $csv
【讨论】:
【参考方案4】:对于某些应用程序,我发现生成哈希表并使用 .values
作为列是很好的(它允许针对正在枚举的另一个对象进行交叉引用验证)。
在这种情况下,freenode 上的#powershell 让我注意到了一个有序的哈希表(因为必须使用列标题)。
这是一个未经任何验证的示例.values
$newcolumnobj = [ordered]@
#input data into a hash table so that we can more easily reference the `.values` as an object to be inserted in the CSV
$newcolumnobj.add("volume name", $currenttime)
#enumerate $deltas [this will be the object that contains the volume information `$volumedeltas`)
# add just the new deltas to the newcolumn object
foreach ($item in $deltas)
$newcolumnobj.add($item.volume,$item.delta)
$originalcsv = @(import-csv $targetdeltacsv)
#thanks to pscookiemonster in #powershell on freenode
for($i=0; $i -lt $originalcsv.count; $i++)
$originalcsv[$i] | Select-Object *, @l="$currenttime"; e=$newcolumnobj.item($i)
示例与How can I perform arithmetic to find differences of values in two CSVs?相关
【讨论】:
【参考方案5】:我见过的脚本都不是动态的,所以它们的范围和你可以用它们做什么都相当有限。这可能是因为大多数 PS 用户甚至超级用户都不是程序员。您很少在 Powershell 中看到数组的使用。我接受了 Shay Levy 的回答并对其进行了改进。
注意:导入需要保持一致(例如两列),但修改它以动态计算列并以这种方式生成标题会相当容易。对于这个特定的问题,没有被问到。或者除非需要,否则根本不生成标题。
不用说,下面的内容将拉入文件夹中存在的尽可能多的 CSV 文件,添加标题,然后将其剥离。我添加标题的原因是为了数据的一致性,它也使得稍后在行中操作列也相当简单(如果您选择这样做)。您可以根据自己的喜好对其进行修改,也可以随意将其用于其他目的。这通常是我为满足任何 Powershell 需求而坚持使用的格式。计数器的使用基本上允许您操作单个文件,因此这里有很多可能性。
$chargeFiles = 'C:\YOURFOLDER\BLAHBLAH\'
$existingReturns = Get-ChildItem $chargeFiles
for ($i = 0; $i -lt $existingReturns.count; $i++)
$CSV = Import-Csv -Path $existingReturns[$i].FullName -Header Header1,Header2
$csv | select *, @Name='Header3';Expression='Header3 Static'
| select *, @Name='Header4';Expression='Header4 Static Tet'
| select *, @Name='Header5';Expression='Header5 Static Text'|
CONVERTTO-CSV -DELIMITER "," -NoTypeInformation |
SELECT-OBJECT -SKIP 1 | % $_ -replace '"', "" |
OUT-FILE -FilePath $existingReturns[$i].FullName -FORCE -ENCODING ASCII
【讨论】:
【参考方案6】:你也可以使用Add-Member
:
$csv = Import-Csv 'input.csv'
foreach ($row in $csv)
$data = Get-DataFromSomewhere -Id $row.Id
$row | Add-Member -Name 'first_name' -Value $data.FirstName -MemberType NoteProperty
$row | Add-Member -Name 'last_name' -Value $data.LastName -MemberType NoteProperty
$csv | Export-Csv 'output.csv' -NoTypeInformation
【讨论】:
以上是关于将列添加到 CSV Windows PowerShell的主要内容,如果未能解决你的问题,请参考以下文章
在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾