我有一个相当标准的带有标题的csv文件我想添加一个新列&将所有行设置为相同的数据。
column1, column2
1,b
2,c
3,5
column1, column2, column3
1,b, setvalue
2,c, setvalue
3,5, setvalue
如果有人能指出我的方向很好,我就找不到任何相关内容。对不起,Power Shell很新。
答案 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"