22

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

原来的:

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

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

如果有人能指出我正确的方向,那我找不到任何东西。抱歉,对 Power Shell 很陌生。

4

6 回答 6

56

这是使用计算属性的一种方法:

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

于 2013-06-10T10:47:25.710 回答
11

ShayLevy 的回答也适用于我!

如果您不想为每个对象提供一个值,但代码更容易......

Import-Csv file.csv | 
Select-Object *,"column3" | 
Export-Csv file.csv -NoTypeInformation
于 2015-03-25T14:36:42.117 回答
3

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

}
于 2020-06-08T19:49:35.017 回答
1

你也可以使用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
于 2021-02-18T14:25:42.250 回答
0

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

于 2017-04-19T14:53:03.060 回答
-2

创建一个没有任何内容的 csv 文件

$csv >> "$PSScriptRoot/dpg.csv"

定义 csv 文件的路径。这里 $psscriptroot 是脚本的根

$csv = "$PSScriptRoot/dpg.csv"

现在向它添加列

$csv | select vds, protgroup, vlan, ports | Export-Csv $csv

于 2016-01-18T12:38:24.743 回答