我有一个包含多个供应商(Cisco,Redhat,vmware..etc)的CSV文件,我需要一个PowerShell脚本来读取此列(供应商)并添加单独的列“ Multiple1 or Multiple2”(备注)(如果CSV)包含同一供应商的多个条目。
我已附上示例文件的屏幕截图。
我从头开始尝试完成此操作,但是没有用。
答案 0 :(得分:0)
好吧,在斯皮克斯(Spikeys)最后发表评论之后,我可以猜测他可能想要实现的目标。
我创建了一个CSV文件:
Product,Template
Microsoft Windows,
RedHat Enterprise,
Apple Safari,
Microsoft Windows,
RedHat Enterprise,
RedHat Enterprise,
,然后编写以下脚本。被注释并产生以下输出:
Product Template
------- --------
Microsoft Windows Multiple2
RedHat Enterprise Multiple3
Apple Safari Multiple1
Microsoft Windows Multiple2
RedHat Enterprise Multiple3
RedHat Enterprise Multiple3
代码:
$Csv = Import-Csv -Path "C:\Book1.csv"
#Hastables have key - value pairs. Example "Microsoft Windows" = 1. Here 'Microsoft Windows' is the key and '1' is the value
[hashtable]$ProductCount = @{}
#Go through each line in the CSV. This returns the product name e.g. Microsoft Windows
ForEach ($Product in $Csv.Product)
{
#If there us no key for the current product in hashtable $Productcount, then add it with value 1
If ($ProductCount.Keys -notcontains $Product)
{
$ProductCount.Add($Product, 1)
}
#If the above does not apply, then increase the value (effectively the count) by 1
Else
{
$ProductCount[$Product] = $ProductCount[$Product] + 1
}
}
#Go through each row in the CSV file. Each row is returned as it's own object with a 'Product' and 'Template' property
ForEach ($Row in $Csv)
{
#Extract the count for the current product from hastable $ProductCount
$Count = $ProductCount[$Row.Product]
#Set the 'Template' property for the current row object to multipile + the count we got earlier
$Row.Template = "Multiple$Count"
}
#Save the changes to the CSV file as a new CSV. You can also overwrite your old one if you like
$Csv | Export-Csv -Path "C:\Book2.csv"
我不太了解您的问题,但是以下是一些在处理CSV文件时有用的技术。
示例CSV:
Name,City
Bob,BlackPool
Alice,Dover
Carl,Manchester
假设您将CSV文件分配给这样的变量
$CSV = Import-CSV -Path "C:\Stuff.csv"
1。。您可以通过键入变量dot(。)列标题来访问列中的所有行,因此
$CSV.Name
返回:
Bob
Alice
Carl
2。。要访问CSV文件中的一行,您需要使用索引编制,因此
$CSV[1]
返回:
Name City
---- ----
Alice Dover
3。。替换特定行的属性的一种简便方法是使用Where-Object对其进行过滤。假设我想将卡尔的城市更改为伦敦。
$($CSV | Where-Object {$_.Name -like "Carl"}).City = "London"
发生了什么事
首先处理括号中的内容,因此我们选择Name属性类似于“ Carl”的行(您可以在此处使用通配符,因此“ Ca *”也可以使用)。然后,在括号之外,将city属性设置为“ London”。
注意:$ _代表管道中当前的数据,在这种情况下,这是包含Carl的行。
还有更多的事情要知道,但这可能对您有最大的帮助。
不要忘记使用Export-CSV cmdlet保存更改!
$CSV | Export-CSV -Path "C:\new.csv" -NoTypeInformation