Công cụ Sắp Xếp Dòng
Sắp xếp, đảo ngược, loại trùng hoặc xáo trộn ngẫu nhiên các dòng văn bản.
Chế độ sắp xếp
Về sắp xếp dòng
Sắp xếp dòng tổ chức văn bản bằng cách so sánh từng dòng theo thứ tự đã chọn. Sắp xếp theo bảng chữ cái hữu ích cho danh sách, bảng thuật ngữ và danh bạ. Sắp xếp theo số coi mỗi dòng là một số và xếp theo giá trị. Sắp xếp theo độ dài gom các mục ngắn và dài, tiện lợi cho định dạng và bố cục.
Công cụ này cũng cho phép xóa các dòng trùng lặp, loại bỏ các dòng trống, làm sạch khoảng trắng, đảo ngược thứ tự hoặc xáo trộn ngẫu nhiên các dòng. Tất cả quá trình xử lý diễn ra tức thì và trong trình duyệt của bạn.
Sử dụng phổ biến
- Sắp xếp danh sách tên, mục hoặc mục nhập theo thứ tự bảng chữ cái
- Sắp xếp các giá trị cột CSV hoặc mục nhật ký
- Xóa trùng lặp khỏi tệp hoặc tập dữ liệu
- Rút thăm danh sách cho xổ số hoặc phân công ngẫu nhiên trong trò chơi
- Sắp xếp số từ nhỏ nhất đến lớn nhất hoặc ngược lại
- Làm sạch dữ liệu bằng cách xóa khoảng trắng và dòng trống
Câu hỏi thường gặp
Sắp xếp theo số hoạt động như thế nào?
Sắp xếp theo số trích xuất số ở đầu mỗi dòng và xếp theo giá trị đó. Các dòng không bắt đầu bằng số sẽ được đặt ở cuối. Điều này có nghĩa là « 9 mục » đứng trước « 10 mục » (khác với sắp xếp theo bảng chữ cái, nơi « 10 » sẽ đứng trước « 9 »).
« Xóa trùng lặp » làm gì?
Tùy chọn này xóa các dòng xuất hiện nhiều hơn một lần, chỉ giữ lại lần xuất hiện đầu tiên. Kết hợp với « Không phân biệt hoa thường », các dòng chỉ khác nhau về chữ hoa/thường cũng được coi là trùng lặp.
Xáo trộn có thực sự ngẫu nhiên không?
Xáo trộn sử dụng thuật toán Fisher-Yates với Math.random(). Phù hợp cho việc sử dụng phổ biến như xáo trộn danh sách hoặc rút tên ngẫu nhiên. Nó không an toàn về mật mã · đối với tính ngẫu nhiên có yêu cầu bảo mật cao, hãy dùng công cụ chuyên dụng.
Sắp xếp dòng là gì?
Sắp xếp dòng là thao tác sắp xếp lại các hàng của một tệp văn bản hoặc danh sách theo một quy tắc đã chọn. Quy tắc có thể là từ điển (so sánh các ký tự từ trái sang phải theo code point Unicode của chúng), số học (trích xuất một số đứng đầu và so sánh các giá trị), dựa trên độ dài (so sánh số ký tự), hoặc ngẫu nhiên (một Fisher-Yates shuffle tạo ra một hoán vị ngẫu nhiên đồng đều). Mỗi quy tắc trả lời một câu hỏi khác nhau về dữ liệu của bạn.
Công cụ này hiển thị tám chế độ sắp xếp (A đến Z, Z đến A, số học tăng dần, số học giảm dần, ngắn nhất trước, dài nhất trước, shuffle, đảo ngược) cộng với bốn tùy chọn có thể bật/tắt (không phân biệt chữ hoa thường, cắt khoảng trắng, xóa các bản sao, xóa các dòng trống). Các kết hợp bao quát các quy trình làm sạch danh sách hàng ngày mà trước đây yêu cầu một dòng Bash với sort, uniq, awk và một pipeline shell. Bây giờ bạn dán các dòng, nhấp vào một chế độ và một vài checkbox, và đọc kết quả.
Tất cả tính toán xảy ra trong trình duyệt của bạn sử dụng Array.prototype.sort tích hợp của JavaScript, sử dụng TimSort (một sự kết hợp của merge sort và insertion sort, ổn định và trường hợp xấu nhất O(n log n)) trong V8, JavaScriptCore và SpiderMonkey từ 2018. Đối với danh sách dưới một triệu dòng, thao tác hoàn thành nhanh hơn thời gian bạn cần để thả nút chuột.
Bên trong trình sắp xếp có gì
Giao diện xếp ba điều khiển: một textarea đầu vào nơi bạn dán các dòng của mình, một hàng tám nút chế độ làm nổi bật lựa chọn đang hoạt động, và một hàng bốn checkbox cho các tùy chọn dedup-and-trim. Bên dưới chúng là nút hành động Sort Lines, tạo ra textarea đầu ra chỉ đọc và cập nhật bộ đếm dòng bên dưới.
Các bộ đếm dòng phía trên và phía dưới đầu vào và đầu ra cho phép bạn kiểm tra tỉnh táo thao tác trong nháy mắt: nếu bạn bắt đầu với 1.234 dòng và đánh dấu Remove Duplicates, số lượng đầu ra sẽ ngay lập tức cho bạn biết có bao nhiêu bản sao đã bị loại bỏ. Phím tắt này nhanh hơn việc viết một tập lệnh Python hoặc AWK một lần cho cùng một nhiệm vụ.
Ba hành động bao gồm phần dưới: Copy Result viết đầu ra vào clipboard của bạn thông qua API Clipboard, Download .txt lưu một tệp văn bản UTF-8 với kết thúc dòng LF, và Clear làm trống cả hai textarea. Không có lịch sử nào được giữ lại, không có cài đặt nào tồn tại, và làm mới trang trả công cụ về trạng thái A-đến-Z mặc định của nó.
Lịch sử và bối cảnh
Máy phân loại thẻ đục lỗ Hollerith (1890)
Máy phân loại thẻ đục lỗ của Herman Hollerith, được xây dựng cho Điều tra dân số Hoa Kỳ năm 1890, một cách máy móc thả từng thẻ vào một trong 12 thùng dựa trên vị trí của một lỗ đục. Các nhà điều hành chạy các thẻ qua máy phân loại nhiều lần, một lần cho mỗi chữ số, để tạo ra một sắp xếp số đầy đủ. Kỹ thuật được gọi là radix sort, và nó hỗ trợ máy tính kinh doanh trong 60 năm tiếp theo. IBM, được thành lập với tên Computing-Tabulating-Recording Company năm 1911, lớn lên trực tiếp từ các máy của Hollerith.
John von Neumann mô tả merge sort (1945)
Trong một báo cáo nội bộ năm 1945 về EDVAC, John von Neumann mô tả merge sort, thuật toán đầu tiên được viết cho một máy tính lưu trữ chương trình. Ý tưởng là đệ quy: chia danh sách thành hai, sắp xếp từng nửa, sau đó hợp nhất hai nửa đã được sắp xếp bằng cách lặp lại lấy phần tử đứng đầu nhỏ hơn. Merge sort vẫn là một ví dụ giáo khoa của chia-và-trị và là cơ sở của TimSort, thuật toán mà V8 sử dụng cho Array.prototype.sort ngày nay.
Tony Hoare phát minh quicksort (1959)
Tony Hoare, khi đó 25 tuổi đến thăm Đại học Quốc gia Moscow để học tiếng Nga, đã thiết kế quicksort vào năm 1959 trong khi cố gắng sắp xếp một danh sách các từ tiếng Nga so với một từ điển tiếng Anh. Thuật toán chọn một pivot, phân vùng danh sách xung quanh nó, và đệ quy ở mỗi bên. Trường hợp trung bình là O(n log n), trường hợp xấu nhất O(n bình phương), nhưng trong thực tế nó vượt qua merge sort do tính cục bộ bộ nhớ đệm. Hoare đã giành giải Turing năm 1980.
J.W.J. Williams giới thiệu heapsort (1964)
J.W.J. Williams đã xuất bản heapsort trên Communications of the ACM năm 1964. Thuật toán xây dựng một heap nhị phân (một cây nơi mỗi cha ít nhất lớn bằng con của nó) và lặp lại trích xuất gốc. Đảm bảo O(n log n) trong cả trường hợp trung bình và xấu nhất, không có bộ nhớ bổ sung, nhưng không thân thiện với bộ nhớ đệm. Heapsort là dự phòng trường hợp xấu nhất bên trong std::sort của C++ (Introsort, 1997).
ASCII cố định thứ tự sắp xếp (1963 đến 1967)
ASCII, được phê chuẩn năm 1963 và sửa đổi năm 1967, đã gán các mã từ 48 đến 57 cho các chữ số 0 đến 9 và từ 65 đến 90 cho chữ hoa A đến Z. Quy ước rằng 0 sắp xếp trước 9 sắp xếp trước A sắp xếp trước Z (và chữ hoa sắp xếp trước chữ thường) được tích hợp vào mỗi sắp xếp từ điển mặc định mà thế giới đã sản xuất kể từ đó. Đây là lý do tại sao Apple sắp xếp trước apple và tại sao 10 sắp xếp trước 9 khi bạn so sánh các chuỗi từng ký tự.
Unicode Collation Algorithm (1996)
Unicode Consortium đã xuất bản Unicode Collation Algorithm (UCA) đầu tiên vào năm 1996, được mã hóa thành UTS #10. UCA cung cấp cho mỗi code point một trọng số đa cấp (sơ cấp, trung cấp, cấp ba) để việc sắp xếp có thể nhận biết-locale: trong tiếng Đức, ä có thể sắp xếp với a hoặc sau z tùy thuộc vào bối cảnh; trong tiếng Thụy Điển, å sắp xếp sau z; trong tiếng Tây Ban Nha, ñ sắp xếp sau n. Intl.Collator của JavaScript (2014) bao bọc UCA và là cái cung cấp năng lượng cho việc sắp xếp danh sách đúng locale trên web.
Quy trình thực tế
Sắp xếp danh sách tên theo thứ tự bảng chữ cái
Bạn có một danh sách lớp học, danh sách người tham dự, hoặc một bản kết xuất liên hệ được dán từ một cột bảng tính. Dán, đánh dấu Case insensitive (để alice và Alice sắp xếp cùng nhau), nhấp A đến Z. Đầu ra đã sẵn sàng để sao chép trở lại vào bảng tính hoặc dán vào dòng BCC của email. Trim Whitespace bắt các khoảng trắng lạc lõng đến từ các tạo phẩm sao chép-dán.
Loại bỏ trùng lặp các mục log
Bạn đã xuất 5.000 thông báo lỗi từ một log máy chủ và muốn biết các thông báo riêng biệt. Dán, đánh dấu Remove duplicates, nhấp A đến Z. Số lượng đầu ra cho bạn biết có bao nhiêu lỗi duy nhất tồn tại. Kết hợp với Trim Whitespace nếu các dòng log có thụt lề biến thiên.
Rút tên cho xổ số hoặc rút thăm
Dán tên thí sinh, mỗi tên một dòng. Nhấp Shuffle. Dòng đầu tiên của đầu ra là người chiến thắng của bạn, dòng thứ hai là người về thứ hai, v.v. Triển khai Fisher-Yates sử dụng Math.random, đồng đều về mặt thống kê nhưng không an toàn về mặt mã hóa. Đối với các cuộc rút thăm có ý nghĩa pháp lý, hãy chạy shuffle trên một máy chủ bằng CSPRNG.
Chuẩn bị một cột CSV
Khi một tệp CSV có các SKU sản phẩm hoặc ID khách hàng không được sắp xếp trong một cột, sao chép cột vào trình chỉnh sửa văn bản, dán vào đây, sắp xếp theo số, và dán lại. Chế độ số xử lý các SKU như 9, 10, 100 đúng cách (từ điển sẽ sắp xếp chúng 10, 100, 9, điều hiếm khi là điều bạn muốn).
So sánh hai danh sách cho các mục bị thiếu
Sắp xếp cả hai danh sách với các tùy chọn giống nhau (A đến Z, Case insensitive, Trim Whitespace). Dán chúng cạnh nhau vào một công cụ diff. Các mục xuất hiện trong một danh sách nhưng không phải danh sách kia trở nên rõ ràng. Điều này nhanh hơn việc quét thủ công các danh sách không được sắp xếp và hoạt động ngay cả khi cả hai danh sách có hàng ngàn mục.
Sắp xếp một backlog hoặc danh sách todo
Khi bạn viết một danh sách todo trong một trình chỉnh sửa văn bản đơn giản và muốn nó trở lại theo thứ tự ưu tiên hoặc bảng chữ cái, dán vào trình sắp xếp. Sử dụng Longest First để đưa các tác vụ đa bước lên đầu, hoặc Shortest First để xóa những chiến thắng dễ dàng trước. Reverse Order hữu ích khi danh sách gốc đã được sắp xếp nhưng theo hướng sai.
Cạm bẫy phổ biến
Sắp xếp từ điển vs số học
Các sắp xếp A-đến-Z mặc định so sánh các chuỗi từng ký tự, vì vậy 10 đến trước 9 bởi vì 1 đến trước 9 trong ASCII. Đối với dữ liệu số, hãy sử dụng chế độ Numeric thay thế. Đối với dữ liệu chữ số hỗn hợp như file2.txt vs file10.txt (sắp xếp tự nhiên), công cụ này không hỗ trợ sắp xếp tự nhiên trực tiếp. Bạn có thể giả mạo nó bằng cách đệm số không trước khi sắp xếp.
Phân biệt chữ hoa thường mặc định là bật
Theo mặc định, sắp xếp phân biệt chữ hoa thường: Apple sắp xếp trước apple vì A viết hoa (65) đến trước a viết thường (97) trong ASCII. Nếu bạn muốn sắp xếp không phân biệt chữ hoa thường (bảng chữ cái không quan tâm đến viết hoa), đánh dấu vào checkbox Case insensitive trước khi nhấp vào Sort Lines.
Khoảng trắng cuối phá vỡ dedup
apple và apple (với khoảng trắng cuối) là các chuỗi khác nhau, vì vậy dedup giữ cả hai. Luôn đánh dấu Trim Whitespace cùng với Remove Duplicates khi xử lý dữ liệu được dán, nếu không số lượng dedup sẽ bị phồng lên bởi những gì trông giống như các dòng giống hệt nhau.
Sắp xếp nhận biết-locale không được hỗ trợ
Công cụ này sử dụng thứ tự code-point Unicode mặc định, đúng cho tiếng Anh và nhiều ngôn ngữ châu Âu nhưng không cho tiếng Đức (ä, ö, ü), Thụy Điển (å, ä, ö), Tây Ban Nha (ñ), hoặc bất kỳ kịch bản nào với quy tắc đối chiếu. Đối với sắp xếp đúng locale, hãy sử dụng một bảng tính hoặc một ngôn ngữ lập trình với hỗ trợ Intl.Collator.
Sắp xếp ổn định được đảm bảo từ 2019
Array.prototype.sort trở nên ổn định trong tất cả các trình duyệt lớn bắt đầu từ Chrome 70 (2018) và Firefox 65 (2019). Trước đó, các phần tử bằng nhau có thể được sắp xếp lại không thể đoán trước, phá vỡ bất kỳ quy trình nào phụ thuộc vào thứ tự chèn. Công cụ này dựa vào sự đảm bảo ổn định hiện đại, vì vậy các dòng bằng nhau ở lại trong thứ tự tương đối ban đầu của chúng.
Chuẩn hóa Unicode ảnh hưởng đến sự bình đẳng
Ký tự é có thể được mã hóa thành một code point đơn (U+00E9) hoặc thành e cộng với dấu sắc kết hợp (U+0065 U+0301). Chúng trông giống hệt nhau nhưng là các chuỗi byte khác nhau, vì vậy dedup sẽ không khớp chúng. Nếu dữ liệu của bạn trộn cả hai dạng, chuẩn hóa với NFC trong một ngôn ngữ lập trình trước, hoặc mong đợi các bản sao sẽ sống sót qua pass dedup.
Quyền riêng tư và xử lý dữ liệu
Mỗi dòng bạn dán được sắp xếp trong trình duyệt của bạn bởi một hàm JavaScript nhỏ. Không có dữ liệu nào rời thiết bị của bạn. Chúng tôi không ghi log đầu vào, không lưu đầu ra, không chạy phân tích liên quan đến nội dung văn bản, hoặc tải các SDK của bên thứ ba có thể đọc các textarea. Các nút Copy Result và Download .txt tương tác với hệ điều hành của bạn thông qua các API cử chỉ người dùng tiêu chuẩn (Clipboard API và thủ thuật ) và không thể nhìn thấy bởi các bên bên ngoài.
Sau khi trang được tải, công cụ hoạt động ngoại tuyến. Bạn có thể ngắt kết nối khỏi mạng, mở trong cửa sổ riêng tư, chạy bên trong một sandbox công ty, hoặc sử dụng chế độ máy bay trên một chuyến bay, và việc sắp xếp sẽ vẫn hoàn thành. Điều này làm cho công cụ an toàn cho các danh sách khách hàng bí mật, các SKU nội bộ, và bất kỳ dữ liệu nào không bao giờ nên chạm vào một máy chủ bên thứ ba.
Khi không sử dụng một trình sắp xếp dòng
Sắp xếp một cột bảng tính với các ô liên quan
Nếu cột A chứa tên và cột B chứa các địa chỉ email tương ứng, sao chép chỉ cột A vào đây và sắp xếp sẽ làm mất đồng bộ mối quan hệ hàng. Sử dụng sắp xếp tích hợp của bảng tính di chuyển toàn bộ hàng cùng nhau. Sắp xếp dòng dành cho văn bản độc lập, không phụ thuộc vào hàng.
Các tập dữ liệu rất lớn (hàng triệu dòng)
Công cụ giữ toàn bộ đầu vào và đầu ra trong bộ nhớ và chạy đồng bộ, điều này có thể đóng băng tab trình duyệt trên các đầu vào hàng triệu dòng. Đối với các tập dữ liệu có kích thước đó, sử dụng một sắp xếp dòng lệnh (Unix sort, sort -u, sort -n) xử lý các tệp có kích thước tùy ý qua external merge sort.
Dữ liệu streaming thời gian thực
Nếu các dòng mới đến mỗi giây (chẳng hạn như một nguồn cấp dữ liệu nhật ký trực tiếp hoặc một luồng websocket), công cụ này không thể theo kịp. Nó được thiết kế cho xử lý hàng loạt văn bản tĩnh. Đối với sắp xếp streaming, hãy sử dụng một cơ sở dữ liệu với một chỉ mục đã được sắp xếp, hoặc một ngôn ngữ lập trình với một hàng đợi ưu tiên.
Dữ liệu có cấu trúc (JSON, CSV với trích dẫn)
Các mảng JSON, các tệp CSV với dấu phẩy được nhúng bên trong các trường được trích dẫn, hoặc các phần tử XML không an toàn để sắp xếp dưới dạng văn bản đơn giản vì các dấu phân cách của chúng kéo dài nhiều dòng. Sử dụng một trình sắp xếp nhận biết-JSON, một trình phân tích CSV, hoặc jq cho việc sắp xếp dữ liệu có cấu trúc.
Thêm câu hỏi
Công cụ sử dụng thuật toán sắp xếp nào?
Công cụ sử dụng Array.prototype.sort tích hợp của trình duyệt, đó là TimSort trong V8 (Chrome, Edge, Node.js từ 2018) và một merge sort tùy chỉnh trong SpiderMonkey (Firefox). Cả hai đều ổn định, trường hợp xấu nhất O(n log n), và được tối ưu hóa cho dữ liệu thế giới thực đã được sắp xếp một phần. Bạn gần như chắc chắn không thể đánh bại chúng với một triển khai JavaScript tùy chỉnh.
Tôi có thể sắp xếp theo locale (Đức, Thụy Điển, Trung Quốc) không?
Không trong công cụ này. Chúng tôi sử dụng thứ tự code-point Unicode mặc định. Đối với sắp xếp nhận biết-locale (Thụy Điển å sau z, Đức ß như ss, Tây Ban Nha ñ sau n), sử dụng một bảng tính với cài đặt locale, hoặc Intl.Collator của JavaScript trong một script tùy chỉnh. Công cụ này dành cho các quy trình mặc định-tiếng Anh.
Tùy chọn Shuffle thực sự ngẫu nhiên như thế nào?
Shuffle sử dụng thuật toán Fisher-Yates (Knuth 3.4.2) với Math.random làm nguồn entropy. Math.random trong các trình duyệt hiện đại sử dụng xorshift128+ (Chrome từ 2015), đồng đều về mặt thống kê và vượt qua các bài kiểm tra ngẫu nhiên, nhưng không an toàn về mặt mã hóa. Đối với các cuộc rút thăm giải thưởng hoặc bất kỳ điều gì có trọng lượng pháp lý, hãy sử dụng crypto.getRandomValues hoặc một CSPRNG phía máy chủ.
Có số lượng tối đa các dòng không?
Không có giới hạn cứng. Công cụ thoải mái xử lý 100.000 dòng trên một laptop tầm trung. Ở 1 triệu dòng, mong đợi một khoảng dừng từ một đến ba giây trong khi trình duyệt thực hiện sắp xếp. Trên đó, textarea bản thân nó trở thành nút cổ chai, và công cụ có thể tạm thời treo tab. Sử dụng một công cụ dòng lệnh cho các tập dữ liệu rất lớn.
Tại sao sắp xếp số của tôi đặt 1.5 giữa 1 và 2?
Sắp xếp số phân tích số đứng đầu bằng cách sử dụng parseFloat, nhận biết các điểm thập phân (1.5), ký hiệu khoa học (1e3), số âm (-5), và các đơn vị cuối bị bỏ qua sau các chữ số. Nếu kết quả không phải là một số, dòng đi đến cuối. Hành vi này phù hợp với hầu hết các kỳ vọng của người dùng nhưng có thể làm bạn ngạc nhiên với các danh sách hỗn hợp số nguyên-và-thập phân.
Việc sắp xếp có sửa đổi đầu vào ban đầu của tôi không?
Không. Textarea đầu vào không bị chạm vào. Đầu ra đã được sắp xếp xuất hiện trong một textarea chỉ đọc riêng biệt. Bạn có thể sắp xếp cùng một đầu vào nhiều lần với các chế độ hoặc tùy chọn khác nhau mà không mất bản gốc. Nút Clear là cách duy nhất để xóa đầu vào, và nó không yêu cầu xác nhận, vì vậy hãy sử dụng nó một cách có chủ ý.