Powershell - замена строк в .csv сгруппированными элементами - PullRequest
1 голос
/ 30 марта 2020

У меня есть следующий сценарий. Файл .csv, содержащий заказы. Заказы с несколькими предметами находятся в отдельных строках. Я группирую строки по идентификатору заказа и sku для выполнения сумм в некоторых столбцах перед экспортом в .csv

У меня есть следующий код, который выполняет группировку и суммы и может выписывать результаты в отдельные .csv

Что мне нужно сделать, это добавить исходный файл .csv, заменив исходные строки суммированными строками. Любая помощь с благодарностью

Например:

пример

$output = @()

# Import .CSV and group on amazon-order-id and sku
# Filter group to only give lines with multiple occurances of each sku per order

Import-Csv D:\Exports\Test\AMAZON\*.csv | Group-Object amazon-order-id, sku | Where-Object {$_.Count -gt 1} | 

# Loop through group object. Take first line of each group and place in $new variable
# Using dot notation, sum required columns and add rows to $output variable

ForEach-Object {

$new = $_.Group[0].psobject.Copy()

$new.'quantity-shipped' = ($_.Group | Measure-Object quantity-shipped -Sum).Sum
$new.'item-price' = ($_.Group | Measure-Object item-price -Sum).Sum
$new.'item-tax' = ($_.Group | Measure-Object item-tax -Sum).Sum
$new.'shipping-price' = ($_.Group | Measure-Object shipping-price -Sum).Sum
$new.'shipping-tax' = ($_.Group | Measure-Object shipping-tax -Sum).Sum
$new.'gift-wrap-price' = ($_.Group | Measure-Object gift-wrap-price -Sum).Sum
$new.'gift-wrap-tax' = ($_.Group | Measure-Object gift-wrap-tax -Sum).Sum
$new.'item-promotion-discount' = ($_.Group | Measure-Object item-promotion-discount -Sum).Sum
$new.'ship-promotion-discount' = ($_.Group | Measure-Object ship-promotion-discount -Sum).Sum

$output += $new

}

#Select all group members and export to .csv file

$output | select * | Export-Csv D:\Exports\Test\AMAZON\Import_Me.csv -not

1 Ответ

0 голосов
/ 30 марта 2020

Я предполагаю, что вы хотите сгруппировать общие строки в одну строку и оставить только те сгруппированные отдельные строки плюс необычные строки.

$CSVFiles = Get-ChildItem -Path D:\Exports\Test\AMAZON -File -Filter '*.csv' | Where Extension -eq '.csv'
$output = foreach ($csv in $CSVFiles) {
    $csvOutput = Import-Csv $csv.FullName
    $group = $csvOutput | Group-Object amazon-order-id, sku
    $group | Where Count -gt 1 | Foreach-Object {
        $_.Group[0].'quantity-shipped' = ($_.Group | Measure-Object quantity-shipped -Sum).Sum
        $_.Group[0].'item-price' = ($_.Group | Measure-Object item-price -Sum).Sum
        $_.Group[0].'item-tax' = ($_.Group | Measure-Object item-tax -Sum).Sum
        $_.Group[0].'shipping-price' = ($_.Group | Measure-Object shipping-price -Sum).Sum
        $_.Group[0].'shipping-tax' = ($_.Group | Measure-Object shipping-tax -Sum).Sum
        $_.Group[0].'gift-wrap-price' = ($_.Group | Measure-Object gift-wrap-price -Sum).Sum
        $_.Group[0].'gift-wrap-tax' = ($_.Group | Measure-Object gift-wrap-tax -Sum).Sum
        $_.Group[0].'item-promotion-discount' = ($_.Group | Measure-Object item-promotion-discount -Sum).Sum
        $_.Group[0].'ship-promotion-discount' = ($_.Group | Measure-Object ship-promotion-discount -Sum).Sum
    }
    $group | Foreach-Object { $_.Group[0] } # Output to variable only
    $group | Foreach-Object { $_.Group[0] } | Export-Csv $csv.FullName -NoType
}
$output

Объяснение:

$CSVFiles - это коллекция файлов CSV. Мы должны быть в состоянии нацелить их один за другим, чтобы знать, какой файл обновлять. Для каждого файла назначается foreach l oop, текущим файлом является $csv.

Поскольку $csvOutput является содержимым файла CSV в виде массива PSCustomObjects, мы можем обновить каждый объект с Foreach-Object, и он будет отражен обратно в $csvOutput.

$group присваивается вывод Group-Object каждого файла CSV. Использование здесь переменной сводит к минимуму группирующее действие только один раз для каждого файла. Сначала выполните модификации в каждой группе, где есть несколько совпадений. Используя вашу логику c, первый объект в группе изменяется. Foreach-Object используется для go через все группировки.

После того, как все изменения сделаны для одного CSV-файла, выводится $group (это включает в себя несколько и одну группировку) и только первый объект в группировка выбирается ($_.Group[0]) с использованием другого Foreach-Object, который также работает для группировок отдельных объектов. Эти выходные данные передаются в Export-Csv для обновления соответствующего файла.

$output перечисляет все содержимое CSV после изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...