ETLとはExtract Transform Load の意味です。
Extract :データの抽出
Transform :データの加工・変換
Load :データを蓄積
データサイエンスでは、Pythonのほうがライブラリも充実していて有利ですが、PowershellでWindowsを操作してきている立場からすると複数のスクリプトを覚えるよりもPowershellで統一したい。と思うのもその通りだと思います。
カスタムオブジェクト(テーブルのようなオブジェクト)として読み込む
CSVの加工をするには扱いやすい
Shift-JISのファイルを読み込むときは -encoding oem を付加する
カスタムオブジェクト
CSVの各列は、カスタムオブジェクトのプロパティになり、
CSVの各行の項目は、カスタムオブジェクトのプロパティの値になる
CSVデータを読み込む
$file_path = 'sample.csv'
$obj_csv = Import-Csv -Path $file_path
※Headerを指定しないとcsvファイル上のヘッダにあたる部分をヘッダ行として読み込みカスタムオブジェクトのプロパティ名になるとしてますが、実際にテストすると1行目をヘッダとして扱っているようです。またヘッダ行があるかないかも自動検出しているようです。ヘッダと識別できない場合はWarningが出力されます
・1行目が空白行の場合:ヘッダが無い警告とともにH1というプロパティ名がつきますが、列と合わないためおかしくなります
・カンマ区切りで値が無い(NULL)場合:1行目空白行と同じでした。H1,H2,H3のようになるかと思いましたがなりませんでした。
ヘッダーを付加してCSVデータを読み込む
$file_path = 'sample.csv'
$header ='date','time','itemA','itemB'
$obj_csv = Import-Csv -Path $file-path -Header $header
テキストファイルとして読み込んでCSVデータからカスタムオブジェクト(テーブルのようなオブジェクト)に変換する
CSVデータを読み込む
$file_path = 'sample.csv'
$obj_csv = Get-Contents -Path $file_path | ConvertFrom-Csv
Powerhell の カスタムオブジェクトをcsvファイル形式の文字列に変換する
Csv形式なのでテキストデータでカンマ区切りということです。
テキストとして扱いたい場合にこのコマンドレットを使ってテキストに変換して処理する場合も利用します。
$Date = Get-Date #Dateオブジェクト
$csv = ConvertTo-Csv $Date -NoTypeInformation #Csvデータ形式
$obj_csv = ConvertFrom-Csv $csv #カスタムオブジェクト
Import-Csv -Path で読み込んだカスタムオブジェクトの情報の表示(プロパティ名などの確認など)
$obj_csv | Get-Member
Import-Csv -Path で読み込んだカスタムオブジェクトを表形式で表示(テーブル内のデータを確認するなど)
$obj_csv | Format-Table
Import-Csv -Path で読み込んだカスタムオブジェクトを活用し列を抽出する
$slct_column = $obj_csv | Select-Object -Property date, itemA
列を追加するには、カスタムオブジェクトに新しくプロパティを追加することで行うことができます
$add_column = $obj_csv | Select-Object *,@{n='列名'; e={'文字列'}}
列を追加するには、カスタムオブジェクトに新しくプロパティを追加することで行うことができます
$add_column = $obj_csv | Select-Object *,@{n='日付'; e={(Get-Date).ToString('yyyy-MM-dd')}}
n=name / e=expression / l=label
Import-Csv -Path で読み込んだカスタムオブジェクトを活用し条件を満たす行を抽出する
$slct-row = $obj_csv | Where-Object {$_.'プロパティ名' -eq "条件"}
$slct-row = $obj_csv | Where-Object {$_.date -eq "20240101"}
$slct-row = $obj_csv | Where-Object {($_.date -eq '20240101')-and ($_.itemA -eq 'BA')}
$slct-row = $obj_csv | Select-Object -First 2 #先頭行から2レコード分抽出
$slct-row = $obj_csv | Select-Object -Last 2 #最終行から2レコード分抽出
$slct-row = $obj_csv | Select-Object -Skip 6 #最終行から6レコード飛ばして7行目以降を抽出
$slct-row = $obj_csv | Select-Object -Skip 6 -First 10
#最終行から6レコード飛ばして7行目以降から10レコード分抽出
指定したカスタムオブジェクトのプロパティで並べ替えを行う(文字列での並べ替え)
$sort_csv = $obj_csv | Sort-Object -Property 'itemA' #昇順
$sort_csv = $obj_csv | Sort-Object -Descending -Property 'itemA' #降順
指定したカスタムオブジェクトのプロパティで並べ替えを行う(整数化しての並べ替え)
$sort_csv = $obj_csv | Sort-Object -Property {[int]$_.'itemA'} #昇順
$sort_csv = $obj_csv | Sort-Object -Descending -Property {[int]$_.'itemA'} #降順
カスタムオブジェクトをCSVファイル形式に変換してファイルに保存する
$Out_file_path = 'sample.csv'
$obj_csv | Export-Csv $Out_file_path -encoding oem
$Out_file_path = 'sample.csv'
$obj_csv | ConvertTo-Csv | Out-file $Out_file_path -encoding oem