2010-08-26 55 views
5

Cảm ơn bạn đã dành thời gian đọc phần này và tôi sẽ đánh giá cao mọi phản hồi đơn lẻ không có chất lượng nội dung. :)Tập tin văn bản sắp xếp PHP (.txt) số

Sử dụng php, tôi đang cố gắng tạo tập lệnh sẽ sắp xếp số lượng tệp văn bản (.txt) theo thứ tự tăng dần (từ thấp nhất đến cao nhất). Mỗi mục trong tệp văn bản nằm trên một dòng mới, do đó tôi muốn các dòng được sắp xếp theo số lượng. Nếu có thể, một khi nó đã được sắp xếp bằng số, tôi muốn dữ liệu được ghi vào một tệp văn bản khác, có tiêu đề "newtime.txt" trong cùng một thư mục. Tất nhiên, nếu có thể. ;)

Phần chính tôi đang gặp phải là nội dung trong tệp văn bản không tĩnh (ví dụ: chứa x số dòng/từ, v.v.) Infact, nó được tự động cập nhật với nhiều dòng. Vì vậy, tôi muốn tất cả các dòng được cập nhật về số lượng.

Các tập tin văn bản theo cấu trúc:

2 aullah1 
12 name 
7 username 

Tất nhiên, được cập nhật thường xuyên với nhiều dòng. Nó sẽ có thể sắp xếp số lượng các dòng? Ngoài ra, tôi dự định sử dụng Cron Job để lặp lại kịch bản sau mỗi 5 phút. ;)

P.S. Điều gì sẽ xảy ra nếu có hai số giống nhau? Sau đó nó sẽ đi vào phân loại dữ liệu theo thứ tự abc?

Tất cả hỗ trợ đều được đánh giá cao và tôi mong nhận được câu trả lời của bạn; cảm ơn bạn. :) Nếu tôi không giải thích rõ ràng và/hoặc bạn muốn tôi giải thích chi tiết hơn, vui lòng trả lời. :)

Cảm ơn bạn.

Trả lời

5

Giả sử bạn đang làm việc với một số lượng hợp lý các dòng (hàng nghìn, không phải hàng triệu) điều này là đủ. Nếu bạn có tập tin rất lớn, bạn có thể chạy vào các vấn đề bộ nhớ sử dụng file():

<?php 

$data = file($file_path); 
natsort($data); 
file_put_contents($new_file_path, implode("\n", $data)); 

Bạn có thể thay thế các đơn file_put_contents với một looped fwrite() cho mỗi phần tử trong $ dữ liệu.

natsort() sẽ sắp xếp các số chính xác (ngược với asort() sẽ đặt 10 trước 2). Đối với các số phù hợp, nó sẽ sắp xếp như bạn mong đợi, so sánh phần còn lại của chuỗi.

natsort(), file()

+0

Xin chào jasonbar, cảm ơn bạn đã phản ứng, tôi cực kỳ đánh giá cao nó cũng như nỗ lực của bạn. Tôi đã thử mã hóa của bạn và nó hoạt động hoàn hảo hơn và đó là những gì tôi sẽ sử dụng. Một lần nữa, tôi không thể cảm ơn đủ. ;) – AUllah1

+0

Bạn sẽ làm gì khi có 500 tỷ hàng để sắp xếp? Các giải pháp trong bộ nhớ không mở rộng. Sử dụng hàm dba _ *() với qdbm. Xây dựng cơ sở dữ liệu của bạn, sử dụng các khóa dẫn xuất dưới dạng khóa và các dòng gốc làm giá trị. Xây dựng các khóa của bạn sao cho chúng sắp xếp theo thứ tự bạn cần, sau đó thực hiện quét tuần tự trên cơ sở dữ liệu, xuất các giá trị (các dòng gốc) vào một tệp mới được sắp xếp. Sau đó đóng và xóa cơ sở dữ liệu. –

5

Bạn có thể làm điều này dễ dàng bằng cách

Đọc các tập tin vào một mảng:

$lines = file($path_to_file); 

Sắp xếp các mảng:

natsort($lines); 

Viết mảng trở lại vào một tập tin mới:

file_put_contents($path_to_new_file, implode(PHP_EOL, $lines)); 
+2

Dòng cuối cùng phải là: 'file_put_contents ($ path_to_new_file, implode (PHP_EOL, $ dòng));' – shamittomar

+0

Cảm ơn, đã sửa tôi – Mischa

+0

Xin chào captaintokyo, cảm ơn bạn đã trả lời. Nó được đánh giá rất cao! Kịch bản của bạn hoạt động hoàn hảo theo mọi cách nhưng có một vấn đề, được chỉ ra bởi jasonbar (cuộn xuống). Nó dường như hiển thị 10 thấp hơn 2, vì 10 có chữ số 1, thấp hơn 2.: (Một lần nữa, tôi đánh giá cao phản ứng của bạn và tôi rất biết ơn vì nỗ lực của bạn.) – AUllah1

3
<?php 
$lines = file("time.txt"); 
natsort($lines); 
file_put_contents("newtime.txt", implode("\n", $lines)); 
?> 
+0

Xin chào Mike, tôi đánh giá cao phản hồi của bạn. Bạn chắc chắn có một kỹ năng trong mã hóa php và mã của bạn hoạt động hoàn hảo. Một lần nữa, cảm ơn bạn đã trả lời và tôi không thể cảm ơn đủ cho nỗ lực của bạn. ;) – AUllah1

1

này đến nay là giải pháp nhanh nhất và thanh lịch nhất mà tôi đã tìm thấy, khi tôi đã có cùng một vấn đề. Nếu bạn đang ở trên Linux (với exec phép trong cấu hình PHP), bạn có thể làm như sau (với điều kiện bạn muốn sắp xếp các file bằng số):

exec("sort -n " . $pathToOriginalFile . " > " . $pathToSortedFile); 

Về cơ bản, thực hiện lệnh bash loại rằng sắp xếp các dòng trong một tệp số. Nếu bạn muốn giữ lại dữ liệu trong file gốc làm điều này:

exec("sort -n " . $pathToOriginalFile . " > " . $pathToSortedFile); 
exec("rm " . $pathToOriginalFile); 
exec("mv " . $pathToSortedFile . " " . $pathToOriginalFile); 

Nếu bạn muốn một loại chữ cái chỉ loại trừ -n tùy chọn (--numeric-sort).

exec("sort " . $pathToOriginalFile . " > " . $pathToSortedFile); 

Đối với tôi lệnh mất khoảng 3 giây để sắp xếp 10 triệu dòng trong tệp trên máy chủ.

Bạn có thể tìm hiểu thêm về sắp xếp tại đây http://www.computerhope.com/unix/usort.htm

Hy vọng điều đó sẽ hữu ích.

+0

Có thể bạn biết cách làm điều đó trên Win? Tôi có số lượng hàng "không hợp lý" (avg 10-20 triệu). –

+0

Uhm, tại sao bạn lại sử dụng máy chủ Win cho ứng dụng PHP? Thành thật mà nói, không có ý tưởng làm thế nào để làm điều này trên Win, nhưng có được trên Linux hoặc OS X càng sớm càng tốt, cho bất kỳ loại công việc PHP. –

+0

Tôi có máy chủ tạm thời trên máy tính để bàn tại nơi làm việc. Nhưng đáng ngạc nhiên shuffle() cho 10 triệu hồ sơ mất khoảng 5 giây :) Dù sao nhờ câu trả lời :) –

Các vấn đề liên quan