2010-06-10 30 views
8

Làm cách nào tốt nhất trong C# để xác định kết thúc dòng được sử dụng trong tệp văn bản (Unix, Windows, Mac)?Xác định kết thúc dòng nào được sử dụng trong tệp văn bản

+2

Lưu ý rằng đối với các tệp unicode, có một số ký tự khác nhau được coi là thuật ngữ dòng pháp lý.Chúng bao gồm: Ký tự trả về vận chuyển (U + 000D), Ký tự cấp dòng (U + 000A), Ký tự trả về dòng (U + 000D) theo sau là ký tự cấp dòng (U + 000A), Ký tự phân cách đường kẻ (U + 2028), và ký tự phân cách đoạn (U + 2029). Đôi khi cũng có một ký tự 'Kết thúc Văn bản' (U + 0003) có thể được sử dụng hợp pháp làm trình kết thúc của dòng cuối cùng của một tệp. – LBushkin

+0

Rất nhiều tập tin thậm chí có một kết hợp của một số loại (HL7, tôi đang nhìn bạn). –

Trả lời

11

ý rằng tập tin văn bản có thể có kết thúc dòng không phù hợp. Chương trình của bạn không nên bị nghẹt thở. Sử dụng ReadLine trên StreamReader (và các phương pháp tương tự) sẽ xử lý mọi dòng có thể tự động kết thúc.

Nếu bạn đọc dòng từ một tệp theo cách thủ công, hãy đảm bảo chấp nhận bất kỳ kết thúc dòng nào, ngay cả khi không nhất quán. Trong thực tế, điều này khá dễ sử dụng thuật toán sau:

  • Quét trước cho đến khi bạn tìm thấy CR hoặc LF.
  • Nếu bạn đọc CR, hãy xem trước ký tự tiếp theo;
  • Nếu ký tự tiếp theo là LF, hãy sử dụng nó (nếu không, hãy đặt lại).
0

Environment.NewLine mặc dù đó chỉ là để xác định những gì được sử dụng trên hệ thống hiện tại và sẽ không giúp đọc các tệp từ nhiều nguồn khác nhau.

Nếu đang đọc, tôi thường tìm kiếm \n (Chỉnh sửa: tốt hơn có một số chỉ sử dụng \r) và giả định rằng dòng kết thúc tại đó.

+1

hmm, tôi muốn chuyển đoạn văn của bạn xung quanh - đoạn thứ hai là câu trả lời - không chắc chắn rằng 'Environment.NewLine' có liên quan quá mức – STW

+0

Không đề cập đến điều này là để đọc từ nhiều nguồn khác nhau hoặc ghi vào nhiều mục tiêu trong câu hỏi như xa như tôi có thể nhìn thấy và thẻ chỉ đơn giản là C# tại thời điểm đó. Tôi đã xem xét 'Environment.NewLine' hữu ích nếu câu hỏi liên quan đến việc viết" chính xác "trên các plattforms khác (mono, v.v.) chẳng hạn. Dù bằng cách nào tôi đã không dành nhiều thời gian xem xét đặt hàng của các đoạn văn. – Don

0

Tôi tưởng tượng bạn không thể biết chắc chắn, sẽ phải đặt điều này trong trình chỉnh sửa. Bạn có thể sử dụng một số AI, thuật toán sẽ là:

  1. Tìm kiếm đối với từng loại dòng kết thúc, bạn sẽ tìm kiếm những nhân vật cụ thể
  2. Đo khoảng cách giữa chúng.
  3. Nếu một loại có xu hướng lặp lại thì bạn cho rằng đó là loại. Đếm lặp lại và sử dụng một số biện pháp phân tán.

Vì vậy, ví dụ: nếu bạn đã lặp lại CRLF ở mức 38, 40, 45 và nằm trong giới hạn bạn muốn mặc định cho đầu dòng là CRLF.

0

Nếu đó là tôi, tôi chỉ đọc tệp một lần một lần cho đến khi tôi bắt gặp số \r hoặc \n đầu tiên. Đây là giả định bạn có đầu vào nhạy cảm.

1

tôi chỉ cần tìm kiếm các tập tin cho \r đầu tiên hoặc \n và nếu nó là một \n Tôi muốn nhìn vào các nhân vật trước đó để xem nếu đó là một \r, nếu như vậy, đó là \r\n nếu không nó là bất cứ được tìm thấy.

+0

Nếu bạn "tìm kiếm tệp cho FIRST' \ r' hoặc '\ n'", thì bạn BIẾT rằng ký tự PREVIOUS không phải là hai ký tự đó. Tôi nghĩ bạn có nghĩa là nhìn vào các ký tự NEXT (để xem nếu cặp là '\ r \ n'). – ToolmakerSteve

0

Đọc hầu hết các định dạng văn bản mà tôi thường tìm \ n và sau đó cắt() toàn bộ chuỗi (khoảng trắng ở đầu và cuối thường thừa).

3

Dưới đây là một số phỏng đoán tiên tiến: đọc file, đếm CR và LFS

if (CR > LF*2) then "Mac" 
else if (LF > CR*2) then "Unix" 
else "Windows" 

Cũng lưu ý, rằng máy Mac mới hơn (Mac OS X) sử dụng Unix kết thúc dòng

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