[jqコマンド] サンプル「csvファイルをパースしてJavascriptへ受け渡す」

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

jqコマンドをだいぶ使いこなしてきて、自作のフレームワークのデータベースへ組み込みもできる様になってきました。
 

世の中全てのデータがjsonでやりとりされればいいのですが、まだまだcsvデータも残っているのが現状です。
 

この間、金融庁でダウンロードしてきた株価データや企業情報、郵便局からダウンロードした郵便番号データなどは、余裕でcsvフォーマットです。
 

このcsvフォーマットというのは、文字エンコードが”Shift-JIS”という、サーバー業界で”UTF-8″を標準にしようと頑張っている中、トラブルも多いこのエンコード技術を使い続けていて、非常にやっかいです。
 

そう考えると、Shift-JISデータは、「古い」という感覚は拭えません。
 

とりあえず、文字エンコードはおいといて、とある会社の株価情報を取得したものをjqコマンドを使ってPHPに取り込んだ時のコマンドサンプルを掲載しておきます。

csvデータとコマンド

 

json形式でもないこのデータをどうやってjqコマンドで受け取るかというと・・・
 

 

解説

最初にsplitが2つ並んでいるのは、「改行コード」と「,カンマ」で縦横の分解をしています。
注意点としては、-sオプションの”–slurp”をつけることを忘れない様にしましょう。
※このオプションをつけていないと、最後に行毎のデータを配列として繋げなれなくなります。
 

マルチバイト文字列が入っている場合は、エンコード対応をしなければいけないのですが、今回は株価データということもあり、数値だけだったので、その点は楽できました。
※後日エンコードタイプもサンプルアップします。
 

csvは分解さえできてしまえば、あとは、単なる配列処理なので、出力用のjson形式を整えてあげるだけです。
 

しかしここでもう一つ落とし穴があり、数値データだけとはいえ、csvを分解するときに、全てのデータを文字列化してsplitを行うため、全ての値が”string”になってしまいます。
 

そして型変換のために、”tonumber”コマンドを使うといいでしょう。
このコマンドは、文字列化された数値を型変換してくれるのですが、数値の桁数が多い場合に入ってしまう”,”カンマなどがあると、数値化できずにエラーになってしまうので要注意です。
また、csvの場合は、空行なども存在するため、ブランク文字列に対してもエラーになってしまいます。
 

その場合は、tonumberの後ろに”?”をつけることで、エラー回避してくれるようになるので、禁則処理としてセットしておきましょう。
 

あっ!そういえば、”,”カンマが数値に含まれていると、splitで分解されてしまいますね。
そういうデータの含まれたcsvを使う場合は、別の分解方法を行わないといけないのですが、今回は手抜きでそこまで書きません。
 

今このデータが処理できればいいのです。

結果出力

 

うむ、なんのも問題もなくクリアできました。
 

とはいってもこの処理を作るのに、ハマりまくって半日費やしたんですけどね!

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です