将列添加到CSV Windows PowerShell

jm81lzqq  于 2022-12-06  发布在  Windows
关注(0)|答案(6)|浏览(219)

我有一个相当标准的csv文件,我想添加一个新的列&将所有行设置为相同的数据。

原件:

column1, column2
1,b
2,c
3,5

之后

column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue

我找不到任何关于这方面的东西,如果有人能给我指出正确的方向,这将是伟大的。对不起,非常新的动力 shell 。

axkjgtzd

axkjgtzd1#

以下是使用“计算特性”执行此操作的一种方法:

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,选择所有现有属性(例如“*”),然后添加一个新属性。

clj7thdc

clj7thdc2#

ShayLevy的回答也对我有效!
如果您不想为每个对象提供一个值,那么代码就更简单了...

Import-Csv file.csv | 
Select-Object *,"column3" | 
Export-Csv file.csv -NoTypeInformation
s3fp2yjn

s3fp2yjn3#

我所见过的脚本都不是动态的,所以它们的范围和你能用它们做的事情都相当有限。这可能是因为大多数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

}
ac1kyiln

ac1kyiln4#

您也可以使用Add-Member

$csv = Import-Csv 'input.csv'

foreach ($row in $csv)
{
    $row | Add-Member -NotePropertyName 'MyNewColumn' -NotePropertyValue 'MyNewValue'
}

$csv | Export-Csv 'output.csv' -NoTypeInformation
s5a0g9ez

s5a0g9ez5#

对于某些应用程序,我发现生成一个哈希表并使用.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中的值的差有关?

kr98yfug

kr98yfug6#

创建一个没有任何内容的csv文件
$csv >> "$PSScriptRoot/dpg.csv"
定义csv文件的路径.这里$psscriptroot是脚本的根
$csv = "$PSScriptRoot/dpg.csv"
现在向其中添加列
$csv | select vds, protgroup, vlan, ports | Export-Csv $csv

相关问题