行の並べ替え&重複削除ツール
テキストの行をA→ZまたはZ→Aの順に並べ替え、重複行や空白行を削除し、item2がitem10より前に来るよう自然な数値順序に補正します — すべてブラウザ内で瞬時に完了します。
221回閲覧
単純なアルファベット順の並べ替えで「item10」が「item2」より前に来る理由
JavaScriptのArray.sort()メソッドや表計算ソフトのA→Zボタンの背後にある標準的な並べ替えは、各文字のUnicodeコードポイントを用いて、2つの行を左から右へ1文字ずつ比較します。連続する数字のまとまりを1つの数値として認識するわけではなく、ある文字が別の文字より小さいか大きいかを、1つの位置ごとに判定しているだけです。そのため、item1、item2、item9、item10、item20を含むリストは、文字ごとの比較によってitem1、item10、item2、item20、item9という順序に並びます。「item10」と「item2」を1文字ずつ比較すると、「item」までは完全に一致し、次の文字がすべてを決定します——「1」対「2」です。文字「1」は文字「2」より小さいため、10のほうが数値としては2より大きいにもかかわらず、item10がitem2より前に並びます。テキストの中に数字が含まれるあらゆるリスト——バージョン番号、image2.jpgやimage10.jpgのようなファイル名、請求書番号、手順書など——がこの問題の影響を受けます。
自然順ソート(natural sort、数値ソートとも呼ばれます)は、連続する数字のまとまりを1つの数値として認識し、1文字ずつではなくその値を比較することでこの問題を解決します。このツールの自然順ソートオプションは、そのロジックをブラウザに標準搭載されているIntl APIに委ね、すべての行のペアに対してa.localeCompare(b, undefined, {numeric: true, sensitivity: "base"})を実行します。numeric:trueフラグは、比較処理に対して数字のまとまりを検出し数値として扱うよう指示します。これにより、item2は正しくitem10より前に、item9はitem20より前に並びます——これは文字ごとの比較が生み出す順序ではなく、リストを読む人間が期待する順序です。
文字コードだけでなく、ロケールを考慮した比較
アルファベット順は、どの言語のルールが適用されるかにも左右されます。数字がまったく関係しない場合でも、単純な比較はここで破綻します。英語では「a」と「A」は大文字・小文字が異なるだけの同じ文字であり、éのようなアクセント付き文字は通常eの近くに並びます。一方トルコ語では、「ı」(点のないi)と「i」(点のあるi)はアルファベット上でそれぞれ独自の位置を持つ、まったく別の文字として扱われます——数値としてのUnicode値しか見ない生のコードポイント比較には、この区別を知る手段がありません。自然順ソートオプションの背後にあるのと同じIntlメソッドであるlocaleCompareは、ロケールのルールを考慮します。sensitivity: "base"を指定すると、並べ替えの目的では大文字・小文字やアクセントの違いを同等として扱いながらも、英語、トルコ語、ドイツ語、その他のラテン文字言語を問わず、各アルファベットの実際の文字順序を尊重します。
このツールは両方の観点を1回の処理で組み合わせます。基本順序としてアルファベット順のA→ZまたはZ→Aを選び、必要に応じて自然な数値ソートを重ねることで、埋め込まれた数字が桁ごとではなく値で比較されるようにし、さらに必要に応じて重複行、空白行、先頭・末尾の空白を取り除きます。重複の検出は行を完全一致の文字列として比較するため、トリム処理が重要になります。「apple」と末尾に空白のある「apple 」は、末尾の空白を先に取り除かない限り重複チェック上は別の行として扱われます。そのため、トリムオプションと重複削除オプションは、無関係な独立したスイッチとしてではなく、連携して機能するように設計されています。
よくある質問
リストを並べ替えると「item10」が「item2」より前に表示されるのはなぜですか?
単純なアルファベット順の並べ替えは、数字のまとまりを1つの整数として扱うのではなく、テキストを1文字ずつ比較するためです。文字「1」は「2」より小さいので、10のほうが2より大きい数値であるにもかかわらず、item10がその1文字だけの比較に勝ってしまいます。これを解決するには自然順(数値)ソートを有効にしてください。連続する数字を1つの数値として検出し、個々の文字ではなく大きさを比較するようになります。
「重複」行とは正確には何を指しますか?
2つの行は、大文字・小文字や先頭・末尾の空白を含めて完全に一致する場合にのみ重複と見なされます。「Apple」と「apple」は別の行として扱われ、末尾に空白のある「banana 」も「banana」とは別行として扱われます。空白の違いを無視したい場合は、重複を削除する前にトリムオプションを有効にしてください。
空白をトリムすると、削除される重複の数は変わりますか?
はい。それ以外は同一の2行が先頭・末尾の空白だけで異なる場合、トリムするまでは別々の行として数えられます。「先頭・末尾の空白をトリムする」をチェックすると、重複チェックが実行される前に両方の行が正規化されるため、こうしたほぼ同一の行が1行にまとまります。
localeCompareはトルコ語やドイツ語など英語以外のテキストの並べ替えにも信頼できますか?
はい——localeCompareはロケールに応じた正しい並べ替えのために設計された、ブラウザ標準の機能です。トルコ語で点のある「i」と点のない「ı」が別の文字として扱われることを認識しており、アクセント付き文字についても、その言語の読者が期待する形で一般的に処理します。これは、生のUnicodeコードポイントに基づく単純な大小比較では実現できないことです。
このツールは私のテキストをどこかにアップロードしたり保存したりしますか?
いいえ——すべての処理はJavaScriptを使ってブラウザ内でローカルに実行され、行がサーバーに送信されたり、記録・保存されたりすることは一切ありません。タブを更新または閉じると、入力内容は完全に消去されます。
関連ツール
問題を報告
行の並べ替え&重複削除ツール
コメント
まだコメントはありません — 最初のコメントを書いてみましょう!