Tôi hiểu rằng QString::split
nên được sử dụng để lấy số QStringList
từ số nhiều QString
. Nhưng nếu tôi có một tập tin và tôi không biết nếu nó đến từ Mac, Windows hoặc Unix, tôi không chắc chắn nếu QString.split("\n")
sẽ làm việc tốt trong tất cả các trường hợp. Cách tốt nhất để xử lý tình huống này là gì?QString :: split() và " r", " n" và " r n" quy ước
Trả lời
Bạn có thể thử:
QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
này chia tách chuỗi bất cứ khi nào bất kỳ kí tự xuống dòng (hoặc thức ăn đường hoặc vận chuyển trở lại) được tìm thấy.
Emanuele Bezzi's answer bỏ lỡ một vài điểm.
Trong hầu hết các trường hợp, chuỗi được đọc từ tệp văn bản sẽ được đọc bằng luồng văn bản, tự động dịch biểu diễn cuối cùng của hệ điều hành thành một ký tự '\n'
. Vì vậy, nếu bạn đang xử lý các tệp văn bản gốc, '\n'
phải là dấu phân cách duy nhất bạn cần phải lo lắng. Ví dụ: nếu chương trình của bạn đang chạy trên hệ thống Windows, đọc đầu vào ở chế độ văn bản, kết thúc dòng sẽ được đánh dấu trong bộ nhớ với một ký tự \n
; bạn sẽ không bao giờ thấy các cặp "\r\n"
tồn tại trong tệp.
Nhưng đôi khi bạn cần phải xử lý tệp văn bản "nước ngoài".
Lý tưởng nhất, bạn có thể nên dịch bất kỳ tệp nào như vậy sang định dạng cục bộ trước khi đọc chúng, điều này tránh được sự cố. Chỉ có tiện ích dịch thuật cần phải nhận thức được kết thúc dòng biến thể; mọi thứ khác chỉ đề cập đến văn bản.
Nhưng điều đó không phải lúc nào cũng có thể; đôi khi bạn có thể muốn chương trình của bạn xử lý các tệp văn bản Windows khi chạy trên hệ thống POSIX (Linux, UNIX, v.v.) hoặc ngược lại.
Tệp văn bản định dạng Windows trên hệ thống POSIX sẽ xuất hiện để có thêm ký tự '\r'
ở cuối mỗi dòng.
Tệp văn bản định dạng POSIX trên hệ thống Windows sẽ xuất hiện bao gồm một dòng rất dài với các ký tự được nhúng '\n'
.
Cách tiếp cận chung nhất là đọc tệp ở chế độ nhị phân và xử lý kết thúc dòng một cách rõ ràng.
Tôi không quen thuộc với QString.split
, nhưng tôi nghi ngờ rằng đây:
QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
sẽ bỏ qua dòng sản phẩm nào, mà sẽ xuất hiện dưới dạng "\n\n"
hoặc như "\r\n\r\n"
, tùy thuộc vào định dạng. Dòng trống là dữ liệu văn bản hoàn toàn hợp lệ; bạn không nên bỏ qua chúng trừ khi bạn chắc chắn rằng nó có ý nghĩa để làm như vậy.
Nếu bạn cần để đối phó với nhập văn bản được phân định bằng cách "\n"
, "\r\n"
, hoặc "\r"
, sau đó tôi nghĩ rằng một cái gì đó như thế này:
QString.split(QRegExp("\n|\r\n|\r"));
sẽ thực hiện công việc. (Cảm ơn lời bình luận của parsley72 đã giúp tôi với cú pháp biểu thức chính quy.)
Một điểm khác: có thể bạn không có khả năng gặp phải các tệp văn bản chỉ sử dụng '\r'
để phân tách các dòng. Đó là định dạng được sử dụng bởi MacOS lên đến phiên bản 9. MaxOS X dựa trên UNIX, và nó sử dụng tiêu chuẩn UNIX kiểu '\n'
dòng kết thúc (mặc dù nó có thể chịu được '\r'
kết thúc dòng là tốt).
TIL rằng Mac OS X không còn sử dụng '\ r', cảm ơn. – sashoalm
'|' không yêu cầu ký tự thoát, nhưng tiếc là thay đổi quá nhỏ để tôi có thể chỉnh sửa! – parsley72
@ parsley72: Cảm ơn, đã sửa. Một số cú pháp rexexp sử dụng '\ |'; QRegExp không, nhưng ngay cả khi nó đã làm '\' sẽ cần phải được thoát trong chuỗi chữ, vì vậy tôi đã sai một trong hai cách. –
- 1. Regex dải \ r \ n hoặc \ r \ n
- 2. Sự khác nhau giữa \ n và \ r \ n là gì?
- 3. PHP chênh lệch giữa \ r \ n \ n
- 4. javascript, thay thế \ n bằng \ r \ n
- 5. Sự khác biệt giữa \ r và \ n là gì?
- 6. Regex (C#): Thay thế \ n bằng \ r \ n
- 7. Thay \ n bằng \ r \ n trong tập tin Unix
- 8. Là một dòng mới = \ n OR \ r \ n?
- 9. Xử lý \ r \ n và \ n dòng mới trong python trên Mac so với Windows
- 10. thay thế \ n và \ r \ n bằng <br /> trong java
- 11. luồng, stream_bufs, codecvt khía cạnh và \ n tới \ r \ n dịch
- 12. Tại sao thành ngữ đệ quy trong Haskell "'n + 1' và 'n'" và không phải là "'n' và 'n-1'"?
- 13. Viết lại URL IIS {R: N} làm rõ
- 14. mảng numpy là (n, 1) và (n,)
- 15. Ngắt dòng nào trong tiêu đề thư php, \ r \ n hoặc \ n?
- 16. Làm thế nào để bỏ qua `\ r \ n 'trong chuỗi
- 17. Ruby CSV không hiểu \ r \ n là hàng cuối
- 18. Tìm ngắt dòng và trả lại dòng (\ r \ n) trong MySQL
- 19. Cần trợ giúp để hiểu cách \ n, \ b, và \ r sẽ hiển thị đầu ra printf
- 20. Sự khác nhau giữa char literals '\ n' và '\ r' trong Java là gì?
- 21. Dừng sed trên cửa sổ để thay đổi \ r thành \ r \ n
- 22. Làm cách nào để {n}? và {n} khác nhau?
- 23. Ước tính T và R từ ma trận thiết yếu
- 24. chữ k đầu tiên và cuối cùng của số n^n
- 25. Kiến trúc/thiết kế N-tầng và N-Layered
- 26. Chuyển đổi \ r văn bản \ n để readlines() hoạt động như dự định
- 27. Gói LaTeX và R?
- 28. Là nhật ký (n!) = Θ (n · log (n))?
- 29. Tại sao tất cả các ngắt dòng của tôi thay đổi từ "/ r/n" sang "/ n /" và làm cách nào để ngăn điều này xảy ra?
- 30. R nhận được chất nền và biểu thức chính quy?
Tôi nghĩ bạn đã bỏ lỡ một số điểm. Xem câu trả lời của tôi. –