web-dev-qa-db-ja.com

列の値に基づいてcsvファイルを分割する<解決済み>

この大きなcsv(セミコロンで区切られた)ファイルがあり、2番目の列の値に基づいて約300個のファイルに分割する必要があります(ファイルにはヘッダー名があります)。このファイルには、約+300万行と54列のヘッダーがあります。このスクリプトはPowershellを使用していますが、実行されていないようです。タスクマネージャで、しばらくの間メモリが構築されていることがわかりますが、出力やエラーメッセージがまったく表示されません。このスクリプトはここにあります 列の値に基づいてxlsx/csvファイルを分割します そして必要に応じてスクリプトを変更します。出力が実行されないため、このスクリプトの何かまたは何が問題になっているのか見落としましたか?.

何が欠けている?

$csv = Import-Csv C:\Data\Points\Se\Test\Data191017.csv -Delimiter ';'

$names = $csv | select -ExpandProperty OFFICENAME -Unique

foreach ($name in $names) { $csv | where {$_.name -like $name} | export-csv C:\Data\Points\Se\Test\20191028_$name.csv }
1
QGIS-user

私はついにそれを機能させました、私はインポートとエクスポート行の両方に-Encodingを追加しました(それが必要かどうかはわかりません)。今ではキャラクターとすべてで正しく動作するので、私は幸せです:)

私を助けて正しい方向に導いてくれてありがとう、以下は私の目的のために働くスクリプトです...

$Source = 'Data_191107.csv'
$Dest = 'C:\temp\test\'
Import-Csv $Source -Delimiter ';' -Encoding 'ISO-8859-1' | %{
$_ | Export-csv -Path "$Dest$($_.OFFICENAME).csv" -Encoding 'ISO-8859-1' -NoTypeInformation -Delimiter ';' -Append
}
1
QGIS-user

専門家ではありませんが、私が読んだことから、特に大きなオブジェクトの場合、中間変数を避け、パイプラインを活用したいと考えています。以下は、小さなサンプルで機能しました。

$Source = 'C:\Data\Points\Se\Test\Data191017.csv'
$Dest = 'C:\Data\Points\Se\Test\'

Import-Csv $Source -Delimiter ';' | %{
   $_ | Export-csv -Path "$Dest$($_.OFFICENAME).csv" -NoTypeInformation -Delimiter ';' -Append
}

パラメータをスプラットすると読みやすくなりますが、大きなデータセットの実行時間への影響はわかりません。

$Source = 'C:\Data\Points\Se\Test\Data191017.csv'
$Dest = 'C:\Data\Points\Se\Test\'

Import-Csv $Source -Delimiter ';' | %{
   $splat = @{
      'Path'              = "$Dest$($_.Country).csv"
      'Delimiter'         = ';'
      'InputObject'       = $_
      'Append'            = $True
      'NoTypeInformation' = $True
   }
   Export-csv @splat
}
0
Keith Miller