Archive for 4 月, 2008
@マーク付きのCSVデータをExcelで読み込むと…
Excelでマクロエラー?
先日、とある会社で動かしているシステムで、クライアントから「データをCSVファイルに書き出して、それをExcelで読み込もうとしたら、『セキュリティエラー』が出たんだけど」との報告が。
最近SQLインジェクション攻撃による改ざんが話題になっていたので、もしかしてこちらのデータも改ざんされてウィルスでも仕込まれたのでは? と一瞬不安がよぎる。
急いでデータの確認。CSVを書き出してExcelに読み込ませてみる。すると、
というExcelのエラーダイアログが。ん? マクロが埋め込まれている?
CSVファイルを少しずつ削っていき、エラーを出しているセルを絞り込んでいく。すると、以下のデータで引っ掛かっていることが判明。
“@table(アットテーブル)”
どうやら、CSVセル内の @table(…) という表記を関数として見なしてしまっているよう(全角、半角関係なし)。”table”を他のExcel関数の名前に変えても、関数と見なされてしまうようだ。
仕方ないのでクライアントにお願いして、当面は@マークのあとに空白を入れてもらうことで回避することに。
@マークの回避方法は…
さて、この@マーク問題。調べてみるとこういうページを発見。
「@」マークが入力できない――打倒「1-2-3」の名残が、今はトラブルのもと
エラーの原因は、セルに入力した「@nifty」といった言葉を、エクセルが“関数式”と誤って認識するため。エクセルは関数式を入力するとき、「= SUM」のように先頭に「=」(イコール)を付ける決まりとなっている。だが実は、「@」も「=」と同様、関数の始まりを表す記号として使われている。試しに、合計を求めるSUM関数の式を「@SUM(B3:D3)」などと入力してみよう。これはエラーとならず、正しい結果が表示されるはずだ。その際、「@」は「=」に自動で置き換えられる。
(中略)
それにしても、なぜ「@」が関数式の始まりを表す記号として認識されるのだろうか。
これはエクセルが、かつての競合「ロータス1-2-3」の仕様を取り入れたためにほかならない。
…なるほど、昔の名残の仕様なのですね。で、Excelから先頭が「@」のデータを入力する場合は、
もちろん対処法はある。「書式」メニューの「セル」を選択し、セルの「表示形式」をあらかじめ「文字列」に設定しておけばよい。すると入力した内容がすべて“文字列”扱いになるので、「@」で始まる言葉も関数式とは認識されず、そのまま表示できる。
また表示形式をそのつど変えなくても、「’」を先頭に付けて入力すれば、「@」で始まる言葉を“文字列”として入力できる。この「’」も、1-2-3から引き継がれた「接頭辞」という機能。1-2-3には、接頭辞を使ってデータを文字列扱いにする機能があった。そして「’」は左揃え、「?」は中央揃え、「”」は右揃えなどと、接頭辞で配置まで指定できたのだ。
しかし、CSV読み込みの場合はこの方法がうまくいかなかった。接頭辞「’」を使うとそのまま「’」付きの文字列データとして読み込まれてしまう。

CSV書き出し時のエスケープ処理について、カンマやダブルクォーテーションに関してはよく言及されているけど、こういう関数やマクロなどのエスケープはどうしたらいいもんですかねぇ。また、ここまで厳密に対応してくれるモジュールってあるのかな?
No comments
