使用PowerShell从CSV读取多个条目

时间:2019-03-14 12:54:10

标签: powershell csv import

我有一个包含多个供应商(Cisco,Redhat,vmware..etc)的CSV文件,我需要一个PowerShell脚本来读取此列(供应商)并添加单独的列“ Multiple1 or Multiple2”(备注)(如果CSV)包含同一供应商的多个条目。

我已附上示例文件的屏幕截图。

我从头开始尝试完成此操作,但是没有用。

Sample File

1 个答案:

答案 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