どうも!リョクちゃです。
今回は、CSVファイルをPowershellで読み込んで、
カッコよく扱った気になれる方法を紹介していきます。
あまりPowerShellでCSVファイルを読み取って、何かすることってないかもしれないですが、
覚えておくと、こんな使い方もあるのかといった知識の向上につながればと思います。
前回はこちらになります。
目次
【準備】CSVファイルの作成
以下のCSVファイルを事前に作成します。
以降は、作成したCSVファイルを使用していきます。
ファイル名は、test_kakaku.csvとしました。
※ヘッダーはあえて設定していません。
ヘッダー:1行目の列の見出し・タイトル
ちなみに実行環境には、VSCodeを使用しております。
CSVファイルを読込む
PowerShellでCSVファイルを読込む方法としてはいくつかあります。
No | コマンド | 詳細 |
---|---|---|
1 | ConvertFrom-Csv | CSVファイルのデータをオブジェクトとして作成 |
2 | Import-Csv | CSVファイルのデータをカスタムオブジェクトとして作成 |
ここでは、Import-Csvを使っていきます。
使い方は簡単です。
以下の構文となっており、基本的にはCSVファイルのパスをオプションである
引数に渡してあげることで簡単にCSVファイルの中身を読み取ってくれます。
1 |
Import-Csv -Path -Delimiter -Header -Encoding |
- -Path : CSVファイルのパス
- -Delimiter : 区切り文字 デフォルトは,(カンマ)
- -Header : ヘッダーの設定ができます。
- -Encoding : エンコードの指定ができます。
先ほど作成した、CSVファイルをまずは読み込んでみるには、
1 |
Import-Csv -Path "C:\work\csv\test_kakaku.csv" -Encoding utf8 |
上述になり、-PathでCSVファイルの保存されているパスを渡しています。筆者の環境では、
Cドライブにworkフォルダを作成し、更にcsvフォルダを作成し、その中にCSVファイルを
保存しています。
-Encodingには、csvファイルを保存した時のエンコードである、utf8を指定しています。
以下のような結果として、Import-Csvの戻り値を受け取ることができます。
1 |
@{りんご=ばなな; 96=106} @{りんご=みかん; 96=238} @{りんご=ゆず; 96=100} @{りんご=れもん; 96=96} |
カッコよく扱う?!
Import-Csvの使い方がわかったので、次はカッコよく読み取った結果を扱えるように
していきます。
結論としては、読み取った結果を辞書型の変数に格納して扱う方法になります。
何かと便利で、辞書に格納しておくことで、効率的に値を取り出すことができます。
※辞書型:PowerShellでは連想配列(ハッシュ、hash)と言われています。
今回作成したCSVファイルのように2つの列で構成されており、1列目の内容が2列目の内容に意味のあるものの場合や同様の法則性がある且つ1列目が重複していなければ、辞書型変数に格納することができ、前述したようにカッコよく扱える?!はずです。
順を追って解説していきます。
ヘッダーがないCSVファイルにヘッダーを付加して取得
作成したCSVファイルには各列にタイトル、いわゆるヘッダーが付加されていませんでした。
このままでは、後々の処理が手間になるので、Import-CSVにオプションを加えて、
ヘッダーを付加します。
1 |
Import-Csv -Path "C:\work\csv\test_kakaku.csv" -Header "id", "name" -Encoding utf8 |
ヘッダーを付加するには、-Headerの後に、カンマ区切りで列名を
“”(ダブルクウォーテーション)で囲んだタイトルを設定していきます。
今回は、1列目をid、2列目をnameとしています。
実行結果は以下のようになります。
1 |
@{id=りんご; name=96} @{id=ばなな; name=106} @{id=みかん; name=238} @{id=ゆず; name=100} @{id=れもん; name=96} |
辞書型変数への格納準備
辞書型変数へ格納するために事前に空の辞書型変数を作成しておきます。
1 |
$dict_res = @{} |
行ごとの繰り返し処理はforeachで
CSVファイルは1行ごとに処理をしていくの、foreach文を活用します。
1 2 3 4 |
foreach ($line in $test_csv) { Write-Host $line.id Write-Host $line.name } |
Write-Hostでは、行ごとの-Headerオプションで設定した名称を使い、
記述されている内容を出力しています。
$line変数には、行ごとの内容が1行ずつ格納されています。
とすることで、列ごとの情報が取得できます。
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#-----1行目----- りんご 96 #-----2行目----- ばなな 106 #-----3行目----- みかん 238 #-----4行目----- ゆず 100 #-----5行目----- れもん 96 |
辞書型変数へ格納
辞書型変数への格納は、foreach文内で行います。
念のため、格納前に既に同じキーを持つ値が格納されていないか、
1列目に対してチェックする処理も織り交ぜていきます。
※今回の例ではありませんが、実践で活用する際にはあると
異常値をはじけるので助かります。
1 2 3 4 5 |
foreach ($line in $test_csv) { if ($dict_res.ContainsKey($line.id) -ne $true) { $dict_res[$line.id] = $line.name } } |
dict_res.ContainsKey($line.id)で辞書型変数に1列目の情報が含まれているか、
どうかをチェックしています。
含まれていなければ、辞書型変数へ格納し、含まれている場合は格納しません。
※既に含まれている場合は、最初の情報を正とするので、実は後の情報が正だった場合には、
気をつけないといけません。
実行結果として、”りんご”と指定して値を取り出してみます。
1 2 3 4 |
Write-Host $dict_res['りんご'] #-----実行結果----- 96 |
まとめ
CSVファイルを読込んでカッコよく?!扱う方法を簡単に紹介しました。
辞書型変数に格納することで値の取り出しはわかりやすく且つシンプルな表現に
なったのではないでしょうか?
プログラミング言語において、様々な文法や書き方を学ぶことは、いろいろな個所で
応用出来たり、工夫次第で化けたりするので、日頃から頭にとどめておくことができればいいのかなと思っています。
最後まで、お読みいただき、ありがとうございます。