
Я знаю, что этот вопрос уже задавался, но мне не повезло с предыдущими ответами. В моей таблице около 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 "