我有一个带有标题的相当标准的 csv 文件,我想添加一个新列并将所有行设置为相同的数据。
原来的:
column1, column2
1,b
2,c
3,5
后
column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue
如果有人能指出我正确的方向,那我找不到任何东西。抱歉,对 Power Shell 很陌生。
我有一个带有标题的相当标准的 csv 文件,我想添加一个新列并将所有行设置为相同的数据。
column1, column2
1,b
2,c
3,5
column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue
如果有人能指出我正确的方向,那我找不到任何东西。抱歉,对 Power Shell 很陌生。
这是使用计算属性的一种方法:
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,选择所有现有属性(例如“*”),然后添加一个新属性。
ShayLevy 的回答也适用于我!
如果您不想为每个对象提供一个值,但代码更容易......
Import-Csv file.csv |
Select-Object *,"column3" |
Export-Csv file.csv -NoTypeInformation
我见过的脚本本质上都不是动态的,所以它们的范围和你可以用它们做什么都相当有限。这可能是因为大多数 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
}
你也可以使用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
对于某些应用程序,我发现生成一个哈希表并将.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)}}
}
创建一个没有任何内容的 csv 文件
$csv >> "$PSScriptRoot/dpg.csv"
定义 csv 文件的路径。这里 $psscriptroot 是脚本的根
$csv = "$PSScriptRoot/dpg.csv"
现在向它添加列
$csv | select vds, protgroup, vlan, ports | Export-Csv $csv