Хорошо, после последнего комментария Спайкиса я попытался угадать, чего он может достичь.
Я создал файл 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