行ソーター

テキストの行をソート、反転、重複削除、ランダムシャッフルします。

データはデバイスから出ません
0

ソートモード

0

行のソートについて

行のソートは、選択された順序で各行を比較してテキストを整理します。アルファベット順のソートは、リスト、用語集、ディレクトリに役立ちます。数値ソートは、各行を数字として扱い、値で並べ替えます。長さによるソートは、短いエントリと長いエントリをグループ化し、フォーマットとレイアウトに便利です。

このツールでは、重複行の削除、空の行の削除、スペースのクリーンアップ、順序の反転、または行のランダムシャッフルもできます。すべての処理は瞬時に行われ、ブラウザ内で実行されます。

一般的な用途

よくある質問

数値ソートはどのように機能しますか?

数値ソートは各行の先頭から数字を抽出し、その値で並べ替えます。数字で始まらない行は最後に配置されます。これは、「9 articles」が「10 articles」より先に来ることを意味します(アルファベット順では「10」が「9」より前に来るのとは対照的です)。

「重複を削除」は何をしますか?

このオプションは、複数回出現する行を削除し、最初の出現のみを保持します。「大文字小文字を区別しない」と組み合わせると、大文字小文字のみが異なる行も重複として扱われます。

シャッフルは本当にランダムですか?

シャッフルはMath.random()でFisher-Yatesアルゴリズムを使用します。リストのランダム化や名前の抽選などの一般的な使用に適しています。暗号的に安全ではありません · セキュリティに関わるランダム性には、専用のツールを使用してください。

行ソートとは?

行ソートは、テキストファイルやリストの行を選択したルールに従って並び替える操作です。ルールは辞書順 (Unicodeコードポイントによる左から右への文字比較)、数値 (先頭の数値を抽出して値を比較)、長さベース (文字数を比較)、ランダム (均一なランダム順列を生成するFisher-Yatesシャッフル) になります。各ルールはデータについて異なる質問に答えます。

このツールは8つのソートモード (A to Z、Z to A、数値昇順、数値降順、最短から、最長から、シャッフル、逆順) と切り替え可能な4つのオプション (大文字小文字を区別しない、空白をトリム、重複を削除、空行を削除) を公開します。組み合わせは、以前はsort、uniq、awkとシェルパイプラインのBashワンライナーが必要だった毎日のリスト-クリーニング ワークフローをカバーします。今度は行を貼り付け、モードと数個のチェックボックスをクリックし、結果を読みます。

すべての計算はJavaScriptの組み込みArray.prototype.sortを使用してブラウザで起こり、V8、JavaScriptCore、SpiderMonkeyで2018年からTimSort (マージソートとインサーションソートのハイブリッド、安定で最悪ケースO(n log n)) を使用しています。100万行未満のリストでは、マウスボタンを離すのにかかる時間よりも速く操作が完了します。

ソーターの内部には何があるか

インターフェースは3つのコントロールを積み重ねます: 行を貼り付ける入力textarea、アクティブな選択をハイライトする8個のモードボタンの行、dedup-and-trimオプションのための4個のチェックボックスの行。それらの下にSort Linesアクションボタンがあり、これは読み取り専用の出力textareaを生成し、下の行カウンタを更新します。

入力と出力の上と下の行カウンタは、一目で操作のサニティチェックを可能にします: 1,234行で始まり、Remove Duplicatesをチェックした場合、出力カウントはすぐにいくつの重複が削除されたかを教えてくれます。このショートカットは、同じタスクのために一回限りのPythonまたはAWKスクリプトを書くよりも速いです。

3つのアクションが底をラップします: Copy ResultはClipboard APIを介して出力をクリップボードに書き込み、Download .txtはLF行末を持つUTF-8テキストファイルを保存し、Clearは両方のtextareaを空にします。履歴は保持されず、設定は永続化されず、ページの更新はツールをデフォルトのA-to-Z状態に戻します。

歴史と背景

ホレリスのパンチカードソーター (1890)

1890年の米国国勢調査のために作られたHerman Hollerithのパンチカードソーターは、パンチされた穴の位置に基づいて各カードを12のビンの1つに機械的に落としました。オペレーターは、完全な数値ソートを生成するために、1桁あたり1回、カードをソーターに何度も通しました。この技術は基数ソートと呼ばれ、その後60年間、ビジネスコンピューティングを支えました。1911年にComputing-Tabulating-Recording Companyとして設立されたIBMは、ホレリスのマシンから直接成長しました。

John von Neumannがマージソートを記述 (1945)

1945年のEDVACに関する内部報告で、John von Neumannはマージソート、つまりプログラム内蔵コンピュータのために書かれた最初のアルゴリズムを記述しました。アイデアは再帰的です: リストを2つに分割し、各半分をソートし、次に小さい方の先頭要素を繰り返し取ることで2つのソートされた半分をマージします。マージソートは分割統治法の教科書的な例のままであり、V8が今日Array.prototype.sortに使用しているアルゴリズムであるTimSortの基礎です。

Tony Hoareがクイックソートを発明 (1959)

Tony Hoareは、当時25歳でロシア語を学ぶためにモスクワ国立大学を訪問していた時、ロシア語の単語リストを英語辞書に対してソートしようとしていた1959年にクイックソートを設計しました。アルゴリズムはピボットを選択し、その周りにリストを分割し、各側で再帰します。平均ケースはO(n log n)、最悪ケースはO(n二乗)ですが、実際にはキャッシュの局所性のためにマージソートを上回ります。Hoareは1980年にチューリング賞を受賞しました。

J.W.J. Williamsがヒープソートを導入 (1964)

J.W.J. Williamsは1964年にCommunications of the ACMにヒープソートを発表しました。アルゴリズムは二分ヒープ (各親が少なくともその子と同じ大きさの木) を構築し、繰り返しルートを抽出します。平均ケースと最悪ケースの両方でO(n log n)が保証され、追加メモリなし、しかしキャッシュ非フレンドリーです。ヒープソートはC++のstd::sort (Introsort、1997) 内の最悪ケースフォールバックです。

ASCIIがソート順序を固定 (1963から1967)

1963年に批准され1967年に改訂されたASCIIは、コード48から57を数字0から9に、65から90を大文字AからZに割り当てました。0が9の前にソートされ、9がAの前にソートされ、AがZの前にソートされる (そして大文字が小文字の前にソートされる) という慣習は、それ以来世界が生み出したすべてのデフォルト辞書順ソートに組み込まれています。これがAppleがappleの前にソートされる理由であり、文字を文字ごとに比較するときに10が9の前にソートされる理由です。

Unicode Collation Algorithm (1996)

Unicode Consortiumは1996年に最初のUnicode Collation Algorithm (UCA) を公開し、UTS #10として成文化しました。UCAは各コードポイントにマルチレベルウェイト (一次、二次、三次) を与え、ソートがロケール対応になります: ドイツ語では、äは文脈に応じてaまたはzの後にソートできます; スウェーデン語では、åはzの後にソートします; スペイン語では、ñはnの後にソートします。JavaScriptのIntl.Collator (2014) はUCAをラップし、Web上のロケール対応のリストソートを動かすものです。

実用的なワークフロー

名前のリストをアルファベット順に並べる

スプレッドシート列から貼り付けられたクラス名簿、参加者リスト、または連絡先ダンプがあります。貼り付け、Case insensitiveをチェック (aliceとAliceが一緒にソートされるように)、A to Zをクリックします。出力はスプレッドシートに戻すかメールのBCC行に貼り付ける準備ができています。Trim Whitespaceはコピー&ペーストのアーティファクトから来るはぐれたスペースをキャッチします。

ログエントリの重複排除

サーバーログから5,000のエラーメッセージをエクスポートし、ユニークなものを知りたいとします。貼り付け、Remove duplicatesをチェック、A to Zをクリックします。出力カウントはいくつのユニークなエラーが存在するかを教えてくれます。ログ行に可変インデントがある場合はTrim Whitespaceと組み合わせてください。

宝くじや抽選のための名前を引く

1行に1つずつコンテスタント名を貼り付けます。Shuffleをクリックします。出力の最初の行はあなたの勝者、2行目は次点者、というように続きます。Fisher-Yatesの実装はMath.randomを使用しており、これは統計的に均一ですが暗号的に安全ではありません。法的な意味を持つ賞品抽選の場合は、CSPRNGを使用してサーバー上でシャッフルを実行してください。

CSV列の準備

CSVファイルに列内にソートされていない製品SKUまたは顧客IDがある場合、列をテキストエディタにコピーし、ここに貼り付け、数値的にソートし、貼り付け直します。数値モードは9、10、100のようなSKUを正しく処理します (辞書順は10、100、9にそれらを並べますが、これはめったに望むものではありません)。

欠落アイテムのために2つのリストを比較

同じオプション (A to Z、Case insensitive、Trim Whitespace) で両方のリストをソートします。それらを並べてdiffツールに貼り付けます。1つのリストには現れるが他のリストには現れない項目が明白になります。これは、ソートされていないリストを手動でスキャンするよりも速く、両方のリストに数千のエントリがあっても機能します。

バックログまたはtodoリストのソート

プレーンテキストエディタにtodoリストを書いて、優先度またはアルファベット順に戻したい場合は、ソーターに貼り付けます。マルチステップタスクを上部に浮上させるためにLongest Firstを使用するか、簡単な勝利を最初にクリアするためにShortest Firstを使用します。Reverse Orderは、元のリストが既にソートされているが間違った方向にある場合に便利です。

よくある落とし穴

辞書順vs数値ソート

デフォルトのA-to-Zソートは文字を文字ごとに比較するため、ASCIIでは1が9の前に来るため、10は9の前に来ます。数値データには、代わりに数値モードを使用します。file2.txt vs file10.txt (自然ソート) のような混合英数字データの場合、このツールは自然ソートを直接サポートしません。ソート前に数字をゼロパッドすることで偽装できます。

大文字小文字の区別はデフォルトでオン

デフォルトでは、ソートは大文字小文字を区別します: AppleはASCIIで大文字A (65) が小文字a (97) の前に来るため、appleの前にソートされます。大文字小文字を区別しないソート (大文字化に関係なくアルファベット順) が欲しい場合は、Sort Linesをクリックする前にCase insensitiveチェックボックスをチェックします。

末尾の空白がdedupを壊す

appleとapple (末尾のスペース付き) は異なる文字列なので、dedupは両方を保持します。貼り付けられたデータを扱うときは、常にRemove Duplicatesと一緒にTrim Whitespaceをチェックしてください。そうしないと、dedupカウントは同じに見える行で膨らみます。

ロケール対応のソートはサポートされていない

このツールはデフォルトのUnicodeコードポイント順序を使用しており、これは英語と多くのヨーロッパ言語には正しいですが、ドイツ語 (ä、ö、ü)、スウェーデン語 (å、ä、ö)、スペイン語 (ñ)、またはcollationルールを持つ任意のスクリプトには正しくありません。ロケール対応のソートには、スプレッドシートまたはIntl.Collatorサポート付きのプログラミング言語を使用してください。

2019年以降、安定したソートが保証される

Array.prototype.sortは、Chrome 70 (2018) とFirefox 65 (2019) から始まるすべての主要ブラウザで安定しました。それ以前は、等しい要素が予測不可能に並べ替えられる可能性があり、挿入順序に依存するワークフローを壊しました。このツールは現代の安定性保証に依存しているため、等しい行は元の相対順序のままです。

Unicode正規化が等価性に影響する

文字éは、単一のコードポイント (U+00E9) として、またはe + 結合用アキュートアクセント (U+0065 U+0301) としてエンコードできます。同じに見えますが、異なるバイトシーケンスなので、dedupはそれらを一致させません。データが両方の形式を混合している場合、最初にプログラミング言語でNFCで正規化するか、重複がdedupパスを生き残ることを予想してください。

プライバシーとデータ取り扱い

貼り付けたすべての行は、小さなJavaScript関数によってブラウザでソートされます。データはデバイスを離れません。入力をログに記録せず、出力を保存せず、テキストコンテンツに結びついたアナリティクスを実行せず、textareaを読み取ることができる第三者SDKをロードしません。Copy ResultとDownload .txtボタンは標準のユーザー-ジェスチャーAPI (Clipboard APIとトリック) を通じてオペレーティングシステムと対話し、外部の関係者には見えません。

ページが読み込まれると、ツールはオフラインで動作します。ネットワークから切断したり、プライベートウィンドウで開いたり、企業サンドボックス内で実行したり、飛行機内でエアプレーンモードを使用したりすることができ、ソートはまだ完了します。これにより、機密のクライアントリスト、内部SKU、第三者サーバーに触れるべきでない任意のデータに対してツールが安全になります。

行ソーターを使わないとき

関連セルを持つスプレッドシート列のソート

列Aに名前があり列Bに対応するメールアドレスがある場合、列Aだけをここにコピーしてソートすると、行の関係が非同期になります。行全体を一緒に移動するスプレッドシートの組み込みソートを使用してください。行ソートはスタンドアロンの、行に依存しないテキスト用です。

非常に大きなデータセット (数百万行)

ツールは入力と出力全体をメモリに保持し、同期的に実行するため、数百万行の入力でブラウザタブをフリーズさせる可能性があります。そのサイズのデータセットには、外部マージソート経由で任意の大きさのファイルを処理するコマンドラインソート (Unix sort、sort -u、sort -n) を使用してください。

リアルタイムストリーミングデータ

新しい行が毎秒到着する場合 (ライブログフィードやwebsocketストリームなど)、このツールは追いつくことができません。静的テキストのバッチ処理用に設計されています。ストリーミングソートには、ソートされたインデックス付きのデータベース、または優先度キュー付きのプログラミング言語を使用してください。

構造化データ (JSON、引用符付きCSV)

JSON配列、引用符付きフィールド内に埋め込まれたカンマを持つCSVファイル、またはXML要素は、それらの区切り文字が複数行にまたがるため、プレーンテキストとしてソートするのは安全ではありません。構造化データのソートには、JSON対応ソーター、CSVパーサー、またはjqを使用してください。

その他の質問

ツールはどのソートアルゴリズムを使用しますか?

ツールはブラウザの組み込みArray.prototype.sortを使用しており、これはV8 (Chrome、Edge、Node.js 2018年以降) ではTimSort、SpiderMonkey (Firefox) ではカスタムマージソートです。両方とも安定で、最悪ケースO(n log n)、部分的にソートされた実世界のデータに最適化されています。カスタムJavaScript実装ではほぼ確実に勝てません。

ロケール (ドイツ語、スウェーデン語、中国語) でソートできますか?

このツールではできません。デフォルトのUnicodeコードポイント順序を使用します。ロケール対応のソート (スウェーデン語のzの後のå、ドイツ語のssとしてのß、スペイン語のnの後のñ) には、ロケール設定付きのスプレッドシート、またはカスタムスクリプトでJavaScriptのIntl.Collatorを使用してください。ツールは英語-デフォルトのワークフロー用です。

Shuffleオプションは実際にはどれくらいランダムですか?

シャッフルはMath.randomをエントロピーソースとしてFisher-Yatesアルゴリズム (Knuth 3.4.2) を使用します。現代のブラウザのMath.randomはxorshift128+ (Chrome 2015年以降) を使用しており、これは統計的に均一でランダムネステストに合格しますが、暗号的に安全ではありません。賞品抽選または法的重みを持つものには、crypto.getRandomValuesまたはサーバーサイドCSPRNGを使用してください。

行数に最大値はありますか?

ハードリミットはありません。ツールはミドルレンジのラップトップで100,000行を快適に処理します。100万行では、ブラウザがソートを行う間、1-3秒の一時停止が予想されます。それ以上では、textarea自体がボトルネックになり、ツールはタブを一時的にハングさせる可能性があります。非常に大きなデータセットにはコマンドラインツールを使用してください。

なぜ私の数値ソートが1.5を1と2の間に置くのですか?

数値ソートは、parseFloatを使用して先頭の数字を解析します。これは小数点 (1.5)、科学表記 (1e3)、負の数 (-5)、および数字の後に無視される末尾の単位を認識します。結果が数値でない場合、行は最後に行きます。この動作はほとんどのユーザーの期待と一致しますが、混合整数と小数のリストで驚かせる可能性があります。

ソートは私の元の入力を変更しますか?

いいえ。入力textareaは変更されません。ソートされた出力は別の読み取り専用textareaに表示されます。元を失うことなく、異なるモードまたはオプションで同じ入力を複数回ソートできます。Clearボタンは入力を消す唯一の方法であり、確認を求めないので、慎重に使用してください。

関連ツール