将列添加到CSV Windows PowerShell

时间:2013-06-10 10:44:05

标签: powershell csv

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

原件:

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

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

如果有人能指出我的方向很好,我就找不到任何相关内容。对不起,Power Shell很新。

6 个答案:

答案 0 :(得分:38)

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

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

答案 1 :(得分:8)

ShayLevy的回答对我也有用!

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

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

答案 2 :(得分:0)

对于某些应用程序,我发现生成哈希表并使用Condition作为列是好的(它允许对正在枚举的另一个对象进行交叉引用验证)。

在这种情况下,freenode上的#powershell将我的注意力引向了一个有序的哈希表(因为必须使用列标题)。

以下是未经.values

验证的示例
.values

示例与How can I perform arithmetic to find differences of values in two CSVs?

有关

答案 3 :(得分:0)

我见过的所有脚本都不是动态的,因此它们的范围以及您可以使用它们的方式都受到了限制。这可能是因为大多数PS用户甚至Power Users都不是程序员。您很少在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

}

答案 4 :(得分:0)

您也可以使用 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

答案 5 :(得分:-2)

创建一个没有其中的csv文件

<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="PruebaT" transports="http" statistics="disable" trace="disable" startOnLoad="true"> <target> <inSequence> <throttle id="AAA"> <policy> <wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:throttle="http://www.wso2.org/products/wso2commons/throttle"> <throttle:ThrottleAssertion> <throttle:MaximumConcurrentAccess>3</throttle:MaximumConcurrentAccess> </throttle:ThrottleAssertion> </wsp:Policy> </policy> <onReject> <log level="custom"> <property name="text" value="**Access Denied**"/> </log> <makefault version="soap11"> <code xmlns:tns="http://www.w3.org/2003/05/soap-envelope" value="tns:Receiver"/> <reason value="**Access Denied**"/> </makefault> <property name="RESPONSE" value="true"/> <header name="To" action="remove"/> <send/> <drop/> </onReject> <onAccept> <log level="custom"> <property name="text" value="**Access Accept**"/> </log> <send> <endpoint> <address uri="http://krishan-Latitude-E5450:8080/ep1"/> </endpoint> </send> </onAccept> </throttle> </inSequence> <outSequence> <throttle id="AAA"/> <send/> </outSequence> </target> <description/> </proxy>

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

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

现在添加列

$csv = "$PSScriptRoot/dpg.csv"