#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: Спасибо, скрипт работает так, как ожидалось. Я могу получить результат. 🙂