Sự cố: Tôi có dữ liệu (chủ yếu ở định dạng CSV) được tạo trên cả Windows và * nix và được xử lý chủ yếu trên * nix. Windows sử dụng CRLF cho kết thúc dòng và Unix sử dụng LF. Đối với bất kỳ tập tin cụ thể tôi không biết liệu nó có cửa sổ hoặc kết thúc dòng * nix. Cho đến bây giờ, tôi đã viết một cái gì đó như thế này để xử lý chênh lệch:Phát hiện đúng dòng cuối của một tệp trong Perl?
while (<$fh>){
tr/\r\n//d;
my @fields = split /,/, $_;
# ...
}
On * nix phần \ n tương đương với nhai, và thêm vào đó được thoát khỏi \ r (CR) nếu đó là một cửa sổ -tập tin được sản xuất.
Nhưng bây giờ tôi muốn văn bản :: CSV_XS b/c Tôi bắt đầu nhận được các tệp dữ liệu khác với dữ liệu được trích dẫn, có khả năng với ngắt dòng nhúng, v.v. Để có được mô-đun này đọc các tệp như vậy, Văn bản :: CSV_XS :: getline() yêu cầu bạn chỉ định các ký tự cuối dòng. (Tôi không thể đọc từng dòng như trên, tr/\ n \ r // d và phân tích cú pháp nó bằng Văn bản :: CSV b/c sẽ không xử lý được ngắt dòng được nhúng đúng cách). Làm cách nào để đúng cách phát hiện xem tệp tùy ý có sử dụng các cửa sổ hoặc dòng kết thúc kiểu * nix hay không, vì vậy tôi có thể cho biết Text :: CSV_XS :: eol() cách chomp()?
Tôi không thể tìm thấy một mô-đun trên CPAN chỉ đơn giản là phát hiện kết thúc dòng. Tôi không muốn đầu tiên chuyển đổi tất cả các datafile của tôi thông qua dos2unix, b/c các tập tin là rất lớn (hàng trăm gigabyte), và chi tiêu 10 + phút cho mỗi tập tin để đối phó với một cái gì đó rất đơn giản có vẻ ngớ ngẩn. Tôi nghĩ về việc viết một hàm đọc hàng trăm byte đầu tiên của một tệp và đếm LF so với CRLF, nhưng tôi từ chối tin rằng điều này không có giải pháp tốt hơn.
Bất kỳ trợ giúp nào?
Lưu ý: tất cả các tệp đều có phần cuối dòng cửa sổ hoặc đầu cuối * nix, nghĩa là chúng không được trộn lẫn trong một tệp.
Cảm ơn bạn, tôi chưa bao giờ biết về PerlIO trước đây. Đây chính xác là những gì tôi cần. – user1481