Чтение нескольких записей из CSV с помощью PowerShell

#powershell #csv #import

#powershell #csv #импорт

Вопрос:

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

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

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

Пример файла

Комментарии:

1. Для получения помощи с вашим кодом: покажите свой код. Объясните, что вы ожидали от кода и что он на самом деле делает. «Не сработало» — неверное описание проблемы.

2. Снимок экрана — это входные данные, или это ожидаемый результат?

3. @MathiasR.Jessen Да, скриншот — это ожидаемый результат, столбец A — это входные данные

4. Очень неясно.. Я вижу 3 любых записи Cisco в первом столбце и значение Multiple3 за ним. Однако Redhat что бы там ни было, также присутствует 3 раза, но имеет Multiple2 . Microsoft выдает Multiple1 , но я вижу там 2 записи.

5. @Theo Извините, если в столбце «A» есть несколько записей, нам нужно добавить «Multiple» в столбец «B». Я добавил Multiple1, Multiple2, чтобы различать имена поставщиков.

Ответ №1:

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

Я создал файл 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. Допустим, я хочу изменить Carl’s city на Лондон.

 $($CSV | Where-Object {$_.Name -like "Carl"}).City = "London"
  

Вот что происходит:

Сначала обрабатывается то, что указано в круглых скобках, поэтому мы выбираем строку, в которой свойство Name похоже на «Carl» (здесь вы можете использовать wilcard, поэтому «Ca *» тоже подошло бы). Затем, за скобками, мы устанавливаем для свойства city значение «Лондон».

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

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

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

 $CSV | Export-CSV -Path "C:new.csv" -NoTypeInformation
  

Комментарии:

1. Спасибо, я постараюсь воспользоваться вашими предложениями. И я сожалею, что вы, ребята, не поняли мой вопрос. вопрос в следующем: если у нас есть несколько записей (имен поставщиков) в столбце «A», нам нужно добавить несколько записей в столбец «B»

2. Привет, Спайки, взгляни на мой отредактированный ответ и скажи мне, это ли то, что ты пытаешься сделать.

3. Привет, MondQ: Спасибо, скрипт работает так, как ожидалось. Я могу получить результат. 🙂