【问题标题】:Reading Multiple Entry from CSV using PowerShell使用 PowerShell 从 CSV 读取多个条目
【发布时间】:2019-08-05 09:09:27
【问题描述】:

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

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

我从头到尾尝试过完成这项工作,但没有成功。

【问题讨论】:

  • 有关您的代码的帮助:显示您的代码。解释你期望代码做什么以及它实际做什么。 “不起作用”不是有效的问题描述。
  • 截图是输入,还是预期的结果?
  • @MathiasR.Jessen 是的,屏幕截图是预期结果,A 列是输入
  • 非常不清楚.. 我在第一列中看到 3 个 Cisco whatever 条目,后面的值为 Multiple3。但是,Redhat whatever 也出现了 3 次,但有 Multiple2Microsoft 得到一个 Multiple1 但我可以在那里看到 2 个条目。
  • @Theo 抱歉,如果“A”列中有多个条目,我们需要在“B”列中添加“多个”。我添加了 Multiple1、Multiple2 来区分供应商名称。

标签: powershell csv import


【解决方案1】:

好的,在 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.您可以通过键入变量点(.)列标题来访问列中的所有行,所以

$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

【讨论】:

  • 谢谢你,我会尽量使用你的建议。我很抱歉,你们没有理解我的问题。问题是:如果我们在“A”列中有多个条目(供应商名称),我们需要在“B”列中添加多个
  • 嗨 Spikey,看看我编辑的答案,告诉我这是否是你想要做的。
  • 嗨,MondQ:谢谢,脚本按预期工作。我能够得到输出。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多