Разделение файла xlsx/csv на основе значения столбца

Разделение файла xlsx/csv на основе значения столбца

Я знаю, что этот вопрос уже задавался, но мне не повезло с предыдущими ответами. В моей таблице около 30000 строк.

Моя электронная таблица отформатирована следующим образом:

Name,colour,postcode,Easting,Northing,type,Group
123,red,1,1,1,1,oscar 
123,blue,1,1,1,1,bravo
122,magenta,1,1,1,1,oscar 
122,turquoise,1,1,1,1,oscar 
121,brown,1,1,1,1,bravo 
121,green,1,1,1,1,oscar

Мне нужно разделить файл на основе поля Имя. Бонусом будет, если я смогу разделить по имени и группе (например, все поля, содержащие 121 и oscar в одном файле и т. д.), но я был бы очень доволен разделением только по имени.

решение1

Попробуйте разделить на разные файлы следующим образом:

$csv = Import-Csv C:\temp\example.csv
$names = $csv | select -ExpandProperty Name -Unique
foreach ($name in $names) { $csv | where {$_.name -like $name} | export-csv c:\temp\example_$name.csv }

Вы можете сделать это снова, заменив имя на группу, чтобы разделить каждый полученный файл, если это поможет.

решение2

Чтобы сгруппировать вывод, просто используйте Group-Objectкомандлет.

> Import-Csv .\example.csv | Group-Object Name,Group | Sort-Object Name

Count Name         Group
----- ----         -----
    1 121, bravo   {@{Name=121; colour=brown; postcode=1; Easting=1; Northing=1; type=1; Group=bravo }}
    1 121, oscar   {@{Name=121; colour=green; postcode=1; Easting=1; Northing=1; type=1; Group=oscar}}
    2 122, oscar   {@{Name=122; colour=magenta; postcode=1; Easting=1; Northing=1; type=1; Group=oscar }, @{Name=12...
    1 123, bravo   {@{Name=123; colour=blue; postcode=1; Easting=1; Northing=1; type=1; Group=bravo}}
    1 123, oscar   {@{Name=123; colour=red; postcode=1; Easting=1; Northing=1; type=1; Group=oscar }}

Обратите внимание, что Group-Objectвыводит собственные фиксированные свойства Count,Name,Group
(не связанные ствойИмена свойств.)
Недостатком здесь является автоматически сгенерированное Nameсвойство, содержащее запятую
(не может быть напрямую использовано для имени выходного файла).

Но вы можете создать группировку «на лету», подобно вычисляемому свойству.

>  Import-Csv .\example.csv | Group-Object {$_.Name+'_'+$_.Group.Trim(' ')}| Sort-Object Name

Count Name         Group
----- ----         -----
    1 121_bravo    {@{Name=121; colour=brown; postcode=1; Easting=1; Northing=1; type=1; Group=bravo }}
    1 121_oscar    {@{Name=121; colour=green; postcode=1; Easting=1; Northing=1; type=1; Group=oscar}}
    2 122_oscar    {@{Name=122; colour=magenta; postcode=1; Easting=1; Northing=1; type=1; Group=oscar }, @{Name=12...
    1 123_bravo    {@{Name=123; colour=blue; postcode=1; Easting=1; Northing=1; type=1; Group=bravo}}
    1 123_oscar    {@{Name=123; colour=red; postcode=1; Easting=1; Northing=1; type=1; Group=oscar }}

Чтобы вывести группы в speakingимена файлов:

Import-Csv .\example.csv | Group-Object {$_.Name+'_'+$_.Group.Trim(' ')} | Sort-Object Name |
   ForEach-Object{
     $File = "example_{0}.csv" -f $_.Name
     $_.Group | Export-Csv -Path $File -NoTypeInformation
   }

Пример результата:

> gci example_*.csv | %{'_'*10+$_.Name+'_'*10;gc $_.Name;""}
__________example_121_bravo.csv__________
"Name","colour","postcode","Easting","Northing","type","Group"
"121","brown","1","1","1","1","bravo "

__________example_121_oscar.csv__________
"Name","colour","postcode","Easting","Northing","type","Group"
"121","green","1","1","1","1","oscar"

__________example_122_oscar.csv__________
"Name","colour","postcode","Easting","Northing","type","Group"
"122","magenta","1","1","1","1","oscar "
"122","turquoise","1","1","1","1","oscar "

__________example_123_bravo.csv__________
"Name","colour","postcode","Easting","Northing","type","Group"
"123","blue","1","1","1","1","bravo"

__________example_123_oscar.csv__________
"Name","colour","postcode","Easting","Northing","type","Group"
"123","red","1","1","1","1","oscar "

Связанный контент