「未分類」カテゴリーアーカイブ

おめしあがりですか?

ちょくちょく利用するハンバーガーショップで注文する時に(すべての店じゃないんだけどいくつかの店舗で)

おめしあがりですか?

と聞かれる。そのたびに心の中で小さく「あたりまえだろ」と突っ込んでいる。

店内でお召し上がりですか?それともお持ち帰りですか?

という質問を省略して「お召し上がりですか?」と言ってるんだとはわかる。わかるんだが、わかるんだが、質問の要点は召し上がるかどうかじゃなくて、店内かどうかだろ? これじゃ持ち帰りするときの受け答えなんて

店員「お召し上がりですか?」
オレ「いいえ」

・・・・・・・変だろ?変だよな。これじゃオレ、食べるつもりがない食べ物を買いに来たってことになっちゃうよな。だいたいにして食べるもの売っておいて「おめしあがりですか?」って聞くの変だろ。意味ないだろ。そうだよね、オレ間違ってないよね?ね?ね?

質問文を短くしたいなら

店内ですか?

じゃないのか? でもこれだとぶっきらぼうな感じを受けてしまうから敬語表現になっている「おめしあがりですか?」の方を使ってるんだろうと好意的に解釈・・・・・・いや、でも、変だ。敬語表現を含みつつできるだけ短いフレーズで質問したいなら

お持ち帰りですか?

が適切なんじゃなかろうか・・・・・・・ブツブツブツ・・・・・・・。

EXCELの謎仕様には涙が止まらない(2)

ちょっと文字コードの話。0と1というデジタルデータが7個で1セットとしたら

0000000
0000001
0000010
0000011
0000100
・・・・・・全部で128通りある。1000001に「A」とか、1110010に「r」とか、0100011に「#」とか0/1の7個セット(128通り)に文字を割り当てたのがASCIIと呼ばれるコンピュータでの文字情報記録方法の始まり。例えば「Love」という文字は 1001100 1101111 1110110 1100101 というデジタルデータで記録する。英語なら大文字、小文字、数字、記号など全部あわせても128通りもあれば十分だったんだな。その後、ドイツ語やスペイン語などの独特な文字も記録できるように0/1を1つ増やして合計8個の0/1を1セット256通りの組合せにしてこれに文字を割り振る方式が一般化している・・・んだと。

ところが日本語だとひらがな、カタカナ、漢字と膨大な数の文字があるので0/1が8個でも全然足りない。そこで0/1を16個1セットにして65,536通りに文字を割り当てることにした。16個の0/1の(65,536通りの)組合せにどんな文字を割り当てるかは JIS とか Shift-JIS とか EUC-JP とかいくつかの流派が存在してる。この流派が「文字コード」。たとえば「久」という字は Shift-JIS だと 1000101101110110 に割り当てられてて、EUC-JP だと 1011010111010111 に割り当てられている。日本語の文字コードだけでも複数の流派があるんだが、言語ごとにどの組合せにどの文字を割り当てるかは各国が独自に決めている。結局 1001000010111101 という組合せでデータが記録されていた時、それがいったいどんな文字なのかはそれが Shift-JIS なのか EUC-JP なのかはたまた中国語なのか韓国語なのか、どの文字コードで記録されてるかによって違う。コンピュータが文字コードの判断に失敗するとデータを作った人の意図とは別の字が表示されてしまう。これが文字化け。だから日本語、中国語、韓国語など文字コードが異なる文字情報を一つのデータの中に記録するのは結構難しい。

グローバル化によって英語、日本語、中国語、ハングル、ベトナム語、アラビア語などなど世界中にある膨大な数の文字を一つの文字コード体系で記録する方法が必要になってきた。そのためには0/1が16個1セットの65,536通りでは全然足りない。そこで「ユニコード」。最大48個の0/1を1セットと考える(1セットの0/1個数が48個に決まってるわけじゃなくて最大48個と可変になっているところもミソ)。すると組合せは・・・・まあ無限とも思えるような組合せを作ってそこに世界中の文字を全部割り当てちゃおうという壮大な話。ユニコードにもいくつか流派が存在するが、一般的なUTF-8では「久」という字は 111001001011100110000101 に割り当てられている。ユニコードを使えば世界中の文字を一つのコードで記録できる。1980年代から大手IT企業が中心になって検討が始まっていたのでもうかれこれ30年経っている。当然ながら最近のWindowsやMacならユニコードを理解できるように作られているし、システム内部もユニコードを積極的に利用している。

中国市場を無視できない化粧品業界でも、日常的に日本語、英語、中国語が入り乱れる文書の作成やデータの作成が必要になってきた。だからウチの会社が作ってるデータベースも文字情報はユニコードで記録するし、画面表示もユニコードで出力する。システム全体で文字情報はユニコードを使う。これが俗にいう「多言語対応」ということ。

さて、データベースに記録されているデータを一覧表形式でファイルとしてダウンロードしたい場合、業界標準で汎用性が高いcsv形式(カンマ区切りテキスト)で出力することが多い。しかし一覧表形式のデータを取り扱う事実上の世界標準ソフトであるはずのEXCELがcsvをまともに扱えないとんでもなくクソ仕様なソフトで、多くのプログラマがEXCELのクソ仕様にあわせたクソ形式のcsvファイルを出力しなければならないという涙腺崩壊物語な状況にあることは以前書いた通り。

さて、csvファイルの中味はデータをカンマで区切ったテキストファイル。日本語、英語、中国語を混在させるなら文字はユニコードで出力する必要がある。ところがユニコードで書き出したcsvファイルをEXCELで開くと見事に文字化けする。えーっ!!。メモ帳で開けばちゃんと中を見ることができる。なのにEXCELで開くと文字化けする。文字コードの判定に失敗するのだ。失敗するというかどうやらEXCELはcsvファイルを開くときに何の判断もせず文字が Shift-JISで記録されていると決め打ちしてるらしい。なんで決め打ちすんの?メモ帳ですら文字コードは何かなぁ?って考えて適切な文字コードで開いてくれるのに、なんでEXCELは何も考えずにShift-JISって決め打ちして開いちゃうのさ。

はあぁぁぁぁ・・・・・・・・

しかし!前回同様、EXCELがユニコードで記録したcsvファイルをまともに開けない問題についても諸先輩プログラマの方々が解決策を編み出してくれているのだ。その解決法とは

(1)ユニコードにもいくつかの流派があって、主流のUTF-8ではなくUTF-16LEで出力する
(2)ファイルの先頭にUTF-16LEであることを示すBOMと呼ばれる特殊な非表示文字を出力しておく
(3)データの区切りをカンマではなくタブにする

以上の方法で出力した csvファイルならダブルクリックしたときにEXCELが文字化けせずに読み込んでくれる。めでたしめでたし

って、ちょっと待て!!

カンマで区切るんじゃなくてタブで区切るだと? そ、それは comma separated values(.csv)ではなく tab separated values(.tsv)なのでは? か、か、カンマ区切り・・・・カンマ区切り・・・・カンマ・・・・こうして、タブで区切ったカンマ区切りテキストを出力するという自分がバカなんじゃないかと思うようなプログラムを書くことになる。タブ区切りで出力したファイルに.csvという拡張子を付けなければならない屈辱感。まあユーザからすればダブルクリックしてEXCELでちゃんと開いてくれりゃカンマで区切ってあろうがタブで区切ってあろうが関係ないんだろうけどね。

嗚呼、EXCELなんてこの世から消えてしまえっ!!!

EXCELの謎仕様には涙が止まらない

データベースから一覧表形式でデータを取り出すときに、カンマ区切りテキスト(csv)形式を使うことが多い。csvはテキストデータだからパソコンでもタブレットでもスマホでもとりあえずテキストファイルが開ける環境さえあれば中を見ることができるし、csvを適切に読み込んで一覧表形式で扱えるソフトも非常に多いから、一覧表形式のデータをやり取りするのに最も汎用性が高い形式のひとつとして古くから使われ続けている。

一覧表形式のデータといえばパソコンではEXCELが事実上の標準ソフト。Windowsパソコンだとcsvファイルをダブルクリックすればほぼ間違いなくEXCELが起動する。

ところがEXCELはありがた迷惑なお節介機能が満載で、データ作成者の意図をまったく無視した勝手な解釈でcsvファイルを開く。

csv・・・・カンマ・セパレーテッド・バリューズ(カンマで区切った値たち)の頭文字でcsv。次のような文字データです。

“姓”,”名”,”国”,”年齢”
“久光”,”一誠”,”日本”,”44″
“田中”,”一郎”,”日本”,”39″
“鈴木”,”太郎”,”日本”,”50″
“バラカン”,”ピーター”,”イギリス”,”61″
“ジョン”,”万次郎”,”日本”,”187″

列をカンマで区切って、行を改行で表わすテキストファイル(テキストファイルだけど拡張子は.txtじゃなくて.csv)。テキストファイルだからメモ帳でもワードパットでも開いてデータを確認できる。EXCELで開けばカンマや改行でセルに分けられた一覧表になるし、EXCEL以外の類似したソフトでも一覧表形式で開くことができる。

システム開発でデータのダウンロード機能が求められると汎用形式であるcsv形式でダウンロードできるように設計することが多いんだが、いろんな場面で『EXCELで開けない!』『EXCELで開いたら変なデータになってる!』という抗議を受けることになる。

例えば3つの数字をハイフンでつないで作られるコードがあったとする。私に身近な例だと化学物質識別コードの「CAS No.」

“物質名”,”CAS登録番号”
“炭酸エチレン”,”96-49-1″
“エチルPABA”,”94-09-7″
“アジピン酸”,”124-04-9″
“カプリリルグリコール”,”1117-86-8″

これメモ帳にコピペして「test.csv」とか適当にファイル名付けてダブルクリックしてEXCELで開くとこうなる↓

excel1

ヲイヲイ、勝手に日付にしてんじゃねえよ。EXCELはcsvデータの中に日付っぽい表現があるとそのセルは日付にしてしまう(えーっ!)。こいつを上書き保存を実行して、再度メモ帳かワードパットでデータを確認すると

物質名,CAS登録番号
炭酸エチレン,96-49-1
エチルPABA,1994/9/7
アジピン酸,124-04-9
カプリリルグリコール,1117-86-8

このように元データの 94-09-7 をキッチリ 1994/9/7 に書き換えてしまっている。勘弁してくれよ。

EXCELは数字だけを並べた文字データを数値に変えてしまうクセもある。例えば

“名前”,”市外局番”,”市内局番”
“久光”,”046″,”869″
“田中”,”03″,”123″
“鈴木”,”06″,”345″

このcsvファイルを EXCEL で開くとこうなる↓

excel2

ヲイヲイ、勝手に数値にしてんじゃねえよ。もちろん上書き保存すると元データからも先頭の0がなくなる。

他にも文字数が多い数字の羅列を勝手に指数表示に書き替えてしまう問題もあるんだぜ。例えば13桁のJANコードを書いた csv ファイル

“商品名”,”JANコード”
“リンゴ”,”4569951116179″
“バナナ”,”1234567890123″

をEXCELで開くとこうなる↓

screen

もちろん上書き保存すると

商品名,JANコード
リンゴ,4.56995E+12
バナナ,1.23457E+12

こんなことになってしまう。他にも EXCEL のお節介機能のせいでデータが正しく表示されない&データが破壊される問題がいろいろある。

ダウンロードしたデータをメモ帳なりワードパットで開いてみればわかるが、システム側は正しく”94-09-7″とか”046″とか”4569951116179″って出力している。それを EXCEL が勝手に”1994/9/7″とか”46″とか”4.56995E+12″に書き替えちゃうわけで、明らかに EXCEL 側に問題があるんだが多くの人はそんなこと知らないので「ちゃんとしたcsvファイルを作ってください!」とcsvファイルを作ったオレが怒られる。こっちはちゃんとしたデータを出力しているのに・・・涙、涙。事情を説明して理解してくれたところで EXCEL を使うしかない会社がほとんどだから何の解決にもならんのだけどね。こんなクソ仕様のソフトなんか世の中から消え去ってくれと多くのエンジニアが思っているに違いない。そしてなんでこんなソフトが何十年もの間、世界標準でいられるのか。これは技術の優劣だけでビジネスの勝敗が決まるわけではないという好例。あ、オレ今なんかカッコいいこと言ったよ。ね、ね、言ったよね。

こちら側は正当な csv ファイルを出力しているのだから『ファイルの拡張子を .txt に変えて EXCEL の[開く]メニューを使ってそのテキストファイルを開いてください。するとテキスト ファイル ウィーザード機能が出てくるのでこれを使って列ごとの書式を[文字列]に指定して開いてください。』という EXCEL お節介機能の回避方法とか『お節介機能がない無料の表計算ソフトがあるのでそれを使ってください。』とか解決策を提示してもまず聞き入れてくれる利用者はない。

まあ、それもいたしかたなし。企業に勤めてるといってもパソコンを使う能力は社員によってピンキリだから基本的にはダブルクリック以上のパソコンスキルがない人を基準に考えないと。ほとんどの状況で「ダブルクリックすればファイルが開いてちゃんと表示される。そうならないのはシステムを作ったオマエが悪い。」という結論以外はでてこない(涙)。

さんざん泣き言をたれたけど、そんなことは遥か昔から多くのプログラマーを悩ませてきた連綿と続く問題なので EXCEL の勝手なお節介機能に対処する方法は、すでに諸先輩プログラマーの方々がいろいろと編み出してくれている(アリガトー、アリガトー)。

対処法その1【データの先頭に「’」(アポストロフィー)を入れる】

excel3

変な文字を先頭に入れておくことでデータが勝手に日付になったり、数値になったり、指数表示になったりすることを抑止する方法。アポストロフィが目立たなくていいけど、「変な文字が先頭についてるんで消してください・・・・」と怒られる。

対処法その2【データの先頭に特殊な空白文字(タブ)を入れる】

excel4

アポストロフィーじゃなくても変な文字ならなんとかなることが多い。データの先頭にタブ文字を入れておくのもその一つ。これだと見た目のうえでは問題ない表示ができる。しかし別のソフトにデータをコピペすると先頭に妙な空白がついてしかも両端にダブルクオート(”)が付いてくるので「コピペすると変になるバグを直してください」と怒られる。見た目が問題ないのにコピペしたら突如変になるというのはパソコン技能が少ない人には驚異的なバグに映る。下手するとオレがEXCELを壊したんじゃないかと疑われかねない。

対処法その3【数式にしてしまう】

excel5

この方法を知った時は思わず鼻汁出そうになった。データを「”=””94-09-7″””」とか「”=””03″””」とか書いておく。パッと見なんのことかわかりにくいんだけど、まず両端のダブルクオート(”)はcsvでデータを囲うためのもの。内側の =””03″” がデータ本体になる。””とダブルクオートが2連続になっているのはダブルクオートで囲っているデータの中でダブルクオートを使いたい場合、データの両端のダブルクオートと区別するために “” と2連続させる(エスケープさせる)というルールに基づいている。つまり””は”だから要するにcsvで「”=””03″””」と書いたデータはEXCELには「=”03″」として認識される。そして=で始まるデータはEXCELは勝手に数式であると判断する。=”ほげほげ”という数式は「ほげほげという文字である」という数式だから =”03″ なら計算結果として画面上には 03 という文字が表示されるわけだ。この方法だと数式バーの部分には数式が表示されるけど、セルには計算結果が表示されている。セルをコピーしてメモ帳とかに貼付けたときも計算結果が貼り付けされるので、コピペしたら変なことにという心配もない。

おおっ!

万事OKのようだが、この方法は EXCEL が = で始まるデータを勝手に数式であると解釈することを逆手にとっている。ということは EXCEL 以外の正しく csv データを扱えるソフトでこの csv ファイルを開くと何じゃこりゃ?な状態になる。もちろんメモ帳やワードパットで開いたときも何が書いてあるのかよくわからない数式のような何かがゴチャゴチャっと書いてある変なファイルにしかみえない。EXCEL 以外のソフトで開くことは絶対にないという前提じゃないと成り立たないこんな変なファイルはもはや csv ファイルではないんじゃないかという根本的な疑問は残る。ユーザとしては EXCELでちゃんと「表示される」ことが最優先なんだからこれで問題ないわけだけどね。

ああ、EXCELってどうしてこうもクソな仕様なんだろう。