昨日・今日と立て続けにファイル名に数字が入る場合のソート順に翻弄されていた。
というのもWindowsではファイル名に数字が含まれる場合、
数字以前の部分が同じファイル同士では数値の大小で名前順が決まる。
foo_1.jpg → foo_2.jpg → foo_12.jpg → foo_100.jpg のような順になるということである。
けっこう変なアルゴリズムだと思うんですけどね。
というのも普通に文字コードの大きい順に並べた場合、
foo_2.jpg と foo_12.jpg は5文字目が ‘2’>’1′ ということで、後者の方が小さいという判定になる。
でも数字同士の場合は、このような単純な文字コードの大小で判定せず、
その後ろに続く数値を使って 1<12 という判定にする仕組みを導入していると。
何が起きたかというと、その後に何も考えずにファイル名でソートする処理を行ったらヘンテコな順序になってしまったと。
ファイル名を付けた人はWindowsの名前順を前提にしていたのだが、
わざわざこんな複雑なアルゴリズムでソートすることはそうそうない。
この問題の解決策は容易で、0を頭に付けて桁数を揃えれば良い。
foo_2.jpg, foo_12.jpg, foo_100.jpg となっているのを、
foo_002.jpg, foo_012.jpg, foo_100.jpg とすれば想定した順序になる。
ファイル名を連番で振り直すツールを使って、Windowsの名前順に bar_001.jpg のように改名する方法でもよい。
ただ、こういうのも余計なお世話じゃないかと思ったのが今日の話で、
部品名のフォルダが並んでいるところからファイルを探すとき、
12345 と 12A45 の間がとても大きく離れていたことである。
この間に 5678 のようなフォルダ名がたくさん挟まってしまうと。
基本的に頭の2桁でシリーズを表すような構造になってるので、
文字コード順に揃えると同じシリーズは同じようなところに集まるはず。
でもWindowsでは 12 < 5678 < 12345 のような判断をしてしまう。
12A45 は数値の大小比較では 12 として扱われるためである。
ということでいらんことしやがってというやつである。
なんでこんなアルゴリズムを採用してるんだろう?
と思ったのだけど、ファイル名に連番を振るとき、
最初はせいぜい100個程度だろうと foo_01.jpg から振り始めて、
でも想定外に数が増えたとき foo_99.jpg の次をどうしようとなったとき、
そこから桁数を増やして foo_100.jpg と振っても期待通りのソートがされる点にメリットがあるのだろう。
そこに期待している人がどれぐらいいるのか? とは思うんですけどね。