列の値に基づいて 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

名前フィールドに基づいてファイルを分割する必要があります。名前とグループで分割できればさらに便利ですが (たとえば、1 つのファイルに 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 "

関連情報