LoginSignup
9
3

More than 5 years have passed since last update.

単なるソートで詰まった話

Last updated at Posted at 2017-12-22

この記事はJustSystems Advent Calendar 2017の22日目の記事です。

はじめに

普段は自然言語処理に使う言語資源をいじっています。

担当している業務のひとつに、

  • 辞書リソース(語句リストのようなもの)をソートしてね
  • Excelの「並べ替え」機能を使ってやってね

という工程が含まれています。

たしかにExcelで行っても特段コストのかかる作業ではありませんが、普通にsortコマンドで済ませたらもっと楽になるのでは?とあるとき思いました。
とはいえ、「ソート手順を変えた」という要因だけで従来のリソースとの差分が大量に出ると面倒くさいです・・・。1

ということで、まずは様々な条件でソートしてみて、Excelのソート結果を再現できるものはあるか試してみました。
結論としては、自分がやってみた限りではsortコマンドではExcelのソート結果を再現できませんでした。
ただ、単なるソートでも色々あるのね・・・とわかったため、今回やってみた検証について紹介しようと思います。

サンプルでやってみる

サンプルデータ

かなり適当ですが、さまざまなタイプの文字を並べてみます。
含めたのは、記号、数字、アルファベット、ひらがな、カタカナ、漢字です。それぞれの字種で、大文字小文字、濁点込みなど、適当にバリエーションをつけました。


@
1
2
a
A
b
B
ァ
ぁ
ア
あ
ィ
ぃ
イ
い
ハ
は
バ
ば
パ
ぱ
ゑ
亜
拼

Excelのソート条件

以下の条件でサンプルデータをソートしておきます。

  • セルの表示形式は文字列にしておく
  • 昇順
  • オプションは「大文字と小文字を区別する」「行単位」「ふりがなを使わない」にチェック

実行コマンド

ただのsortです。
この実行結果とサンプルデータとの差分を見ていきます。

実行環境

以下の環境で実行します。できればwindows環境で作業を完結させたいという理由から、windows環境でコマンドを使えるものを2つ選定しました。複数選んだのは、使うツールによって結果に差がでないか?ということを確認するためです。いずれも凝った設定は特にしていません。

  • linux環境
  • windows環境: Cygwin
  • windows環境: Git Bash

結果

  • いずれのwindows環境でもsortでExcelのソート結果を再現できた
  • linux環境とwindows環境ではソート結果に差分が出た

linuxだと普通にUTF-8の文字コード順に並んでいるようですが、


1
2
@
A
B
a
b
ぁ
あ
ぃ
い
は
ば
ぱ
ゑ
ァ
ア
ィ
イ
ハ
バ
パ
亜
拼

windowsのこの並びは何順・・・?

@
1
2
a
A
b
B
ァ
ぁ
ア
あ
ィ
ぃ
イ
い
ハ
は
バ
ば
パ
ぱ
ゑ
亜
拼

と思いましたが、どうやらJIS X 4061「日本語文字列照合順番」(辞書順)のようです。2
ちなみに、LANG環境変数はいずれも日本語表記向けのja_JP.UTF-8で設定されていますが、この設定をとっぱらうためにLANG=C sortにしてみたところ、linux環境とwindows環境で同様のソート結果が得られました。
こうすることで普通の文字コード順になるようですね。

ともかく、サンプルデータを試してみたところ、windows環境のコマンドでExcel結果の再現ができそうなことがわかりました。

辞書リソースでやってみる

今度は、実際の辞書リソースでソートの比較を行います。

フォーマット

実際のリソースは以下のようにタブ区切りになっています。
Excelでソートをする際は、[文字列1]をキーにしています。
※実際のソースにはblacketは含まれていません。視認性のために便宜的に付与しています。


\t[文字列1]\t[文字列2]\t[文字列3]\t[文字列4]\t[文字列5]\t[文字列6]

Excelのソート条件/実行コマンド/実行環境

サンプルデータと同様です。

結果

  • linux環境、windows環境のいずれにおいてもExcelのソート結果を再現できなかった
  • windows環境とExcelの結果差分が1箇所だけだった

1箇所だけというのも惜しいですね・・・。
具体的には以下のような行で差分が出ました。


① \t[文字列1]\t[文字列2]\t[文字列3]\t[文字列4]\t[文字列5]\t[文字列6]
② \t[文字列1]\t[文字列2]\t\t[文字列4]\t[文字列5]\t[文字列6]

②は3フィールド目が空白になっています。

この2エントリだけがソート条件によって逆になります。
Excelでは①→②の順、windows環境では②→①の順となりました。

この差分の理由ですが、どうやら

  • Excelだと、空白は後ろになるので①→②の順

    Blanks - Excel always places blanks last.

  • windows環境でのソートだと、単純に文字コードでタブと文字列を比較しているので②→①の順

ということだそうです。3
つまり、Excelのソート順は 辞書順をベースにしつつ独自のルールを設けている ということなのでしょうか。

おわりに

これまでの内容をまとめます。

  • Excelのソート結果とsortコマンド実行結果を比較してみた
  • sortではExcelのソート結果を再現できなかった
    • windowsは辞書順ベースらしい
    • ExcelはExcelなりのソートルールがあるらしい

冒頭にも書きましたが、ただのソートをとっても色々あるのだなあと思いました4
それとともに、文字コードまわりの話は厄介かつ奥深いものだなとも感じました。

文字についてのもっと高次なお話はどうやら最終日に聞けるそうです:sunglasses:
ということで、前座噺に5ソート・文字コードのお話を少ししてみました。それではよい週末を!


  1. 扱っているエントリは万オーダーです。リソースの並びが変わることで出力結果に影響はない?などの考慮が必要です。  

  2. @masudakz さんアドバイスありがとうございました。  

  3. Tさんアドバイスありがとうございました。 

  4. 漢数字も数字順にソートされないようですし・・・。 

  5. にもならない? 

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3