Чтение нескольких записей из CSV с помощью PowerShell - PullRequest
0 голосов
/ 14 марта 2019

У меня есть файл CSV, который содержит несколько поставщиков (Cisco, Redhat, vmware..etc), мне нужен сценарий PowerShell для чтения этого столбца (поставщик) и добавления отдельного столбца «Multiple1 или Multiple2» (примечание), если CSVсодержит несколько записей одного и того же поставщика.

Я приложил снимок экрана с файлом примера.

Я пытался сделать это из конца, но это не сработало.

Sample File

1 Ответ

0 голосов
/ 14 марта 2019

Хорошо, после последнего комментария Спайкиса я попытался угадать, чего он может достичь.

Я создал файл 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» (здесь можно использовать wilcard, поэтому «Ca *» также сработало бы). Затем, за пределами скобок, мы устанавливаем для свойства city значение «London».

Примечание: $ _ представляет данные, находящиеся в данный момент в конвейере, в данном случае это строка, содержащая Carl.

Есть еще кое-что знать, но это может помочь вам больше всего.

Не забудьте сохранить изменения с помощью командлета Export-CSV!

$CSV | Export-CSV -Path "C:\new.csv" -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...