JSONの末尾のカンマにご用心
いつも気をつけているのだが、割とうっかりやらかすので戒めのためにメモ。
JSONは元々JavaScriptの記法を元にしたフォーマットだが、実はJavaScript上では許されているがJSONとしては許されていないものがある。
その代表例の一つが末尾のカンマだ。
例えば次はJavaScriptのオブジェクトの例だ。
例: sample1.js
let data = {"key": "value",};
ここで"value"の後ろに , が付いているのがお分かりいただけるだろうか。
これはJavaScriptの記法上OKとなる。
ただし以下の場合は例外が発生する。
例: sample2.js
let data = JSON.parse('{"key": "value",}');
これを実行するとJSON解析の例外としてUncaught SyntaxErrorが発生するのではないだろうか。
これはJSONの書式としては許可されておらず、きちんと , の後ろに要素が必要であることを意味している。
ちなみにこれはJSONの配列(Array)の場合も同様で、すなわちJavaScriptの場合は問題ないがJSONの場合はUncaught SyntaxErrorとなる
(もちろん例外の詳細については異なるが)
ちなみになぜ末尾のカンマをついつい付けてしまうのかについて。
これは割と僕の経験則によるものだが……パッと思いつくだけで以下の3つがある。
- GITなどの差分管理上
- なるべく関係のない行に変更を加えたくないから
- 衝突解決の際のマージの過程で紛れ込んだから
- JSONを出力するfor文(主にテンプレートエンジン)で、分岐処理を書きたくないから(あるいは書き忘れたから)
特に多いのは 1.2. かなと思う。
最後の , の付いていない行を削除するコミットとその直前に行を追加するコミットがぶつかった場合に、気づかずに末尾に , が付与される状態が完成してしまうパターンだ。
しかもこの場合は衝突したどちらのコミットの行も正しくないという状態なので、きちんと自分で編集を加えなければならないことになる
(つまりは正しい行の採択だけで解決できない)
ちなみに , だけを別の行にする手もあるが、結局 , の有無をチェックしなければならないことには変わりない。
また衝突の際に行としての差分が出なくなる可能性もあるので、それはそれで逆に厄介な可能性もあるか。
【R言語】read.csv()で読み込む際にヘッダにXが付与されるのを防ぐ
気軽にRStudioを使ってグラフを吐き出そうと思ったら、思わぬところで引っかかったのでメモ。
R言語でCSVファイルを読み込む際にはread.csv()を利用するのが便利だ。
例: demo1.R
data <- read.csv('demo.csv', header=TRUE, row.names=1, encoding="UTF-8")
例:demo.csv
商品名,10月,11月,12月
商品A,100,110,120
商品B,110,110,100
商品C,120,100,110
CSVなので分かりにくいけれど、データのイメージとしては以下のような感じ。
数値については月毎の商品の売り上げ個数のようなものを想像して貰えば良い。
商品名 | 10月 | 11月 | 12月 |
---|---|---|---|
商品A | 100 | 110 | 120 |
商品B | 110 | 110 | 100 |
商品C | 120 | 100 | 110 |
さて、先ほどのdemo.csvをread.csv()で取り込むと次のようになる。
例: 取り込んだdataの出力
> data
X10月 X11月 X12月
商品A 100 110 120
商品B 110 110 100
商品C 120 100 110
見て分かるようにカラム名の先頭にXが付与されている。
これはカラム名を数字から始めることが許されていないため、問題を回避するために自動でXを付与してしまうということらしい。
これではグラフを生成する場合などでラベル名が変わってしまって困ることになる。
そこで以下のように[check.names=FALSE]を付与することで、この名前の不正チェックをスキップさせることができる。
例: demo2.R
data <- read.csv('demo.csv', header=TRUE, row.names=1, encoding="UTF-8", check.names=FALSE)
例: 取り込んだdataの出力
> data
10月 11月 12月
商品A 100 110 120
商品B 110 110 100
商品C 120 100 110
このままグラフの描写に利用する程度であれば問題なさそう。
ただし恐らくは何らかの理由でカラム名の数字始まりを不正と見做しているはずなので、思いがけずにどこかで不都合が出る可能性もあるので注意。