Группа Powershell Import/Export-csv и объединение ячеек

У меня есть файл csv, который мне нужно сгруппировать и объединить различные ячейки вместе, а затем разделить их точкой с запятой в макете csv как таковой

Макет CSV

Мне удалось объединить ячейки «цена» и «номер функции» вместе и разделить их с помощью «;» но для «datedespatched» и «username», которым просто нужно отображать 1 имя или дату, возвращаемые ячейками с «System.Object []», отображаемым в сжатой ячейке, ячейка «referencenumber», кажется, сжимается нормально. Это мой текущий код и вывод, который я получаю от него.

 Import-Csv 'C:\temp\test.csv' | Group-Object ReferenceNumber |ForEach-Object {
 
 [PsCustomObject]@{

        ReferenceNumber = $_.Name

        userName = $_.Group.userName

        DateDespatched = $_.Group.DateDespatched 

        functionnumber = $_.Group.functionnumber -join '; '

        Price = $_.Group.Price -join '; '
        
        }
 } | Export-Csv 'C:\temp\test-export.csv' -NoTypeInformation 
 

Вывод кода

заранее спасибо


person laxus    schedule 30.11.2020    source источник
comment
Работают ли $_.Group.DateDespatched[0] и $_.Group.Username[0]?   -  person Nico Nekoru    schedule 30.11.2020
comment
Сделайте то же самое для двух других?   -  person Doug Maurer    schedule 30.11.2020
comment
@NekoMusume Да, это сработало! благодарю вас   -  person laxus    schedule 30.11.2020
comment
@DougMaurer Мне нужно, чтобы дата отправки и имя пользователя отображали только 1 в поле, поскольку они всегда одинаковы   -  person laxus    schedule 30.11.2020


Ответы (1)


Когда вы создаете свой пользовательский объект PS, вы объединяете вывод functionnumber и Price, но не userName и DateDespatched. Результатом этого является то, что $_.Group.userName становится массивом, и вы отправляете массив в качестве объекта для вывода. Если вы добавите

-join ';' 

как для имени пользователя, так и для DateDespatched, это будет работать. У меня была аналогичная проблема с этим, и я получил хорошую помощь в в этом посте.

Если вы хотите выводить только одно имя в строке, вы можете передать массивы в

Select-Object -Unique 

чтобы получить только уникальные записи.

person Tanaka Saito    schedule 30.11.2020
comment
Спасибо за это, мне удалось решить эту проблему с помощью $_.Group.DateDespatched[0] и $_.Group.Username[0], как рекомендовал Neko выше. - person laxus; 30.11.2020
comment
Отлично, что это сработало :) [0] в этом решении означает, что вы получаете только первую запись в массиве. Например, $_.Group.Username — это массив, а [#] означает получение числа # из этого массива. Обратите внимание, что это решение игнорирует ситуации, когда у вас есть несколько разных имен пользователей для одного и того же ссылочного номера. - person Tanaka Saito; 30.11.2020