Tôi sử dụng ứng dụng iPhone định kỳ gửi email cho tôi nhật ký ở định dạng CSV. Tôi có một tập lệnh ruby tổng hợp dữ liệu trong nhật ký đó với các nhật ký cũ hơn. Gần đây, nhà phát triển ứng dụng đã phát hành bản cập nhật, vì một số lý do không xác định, hãy thêm một dấu xuống dòng vào cuối mỗi dòng, khiến cho tập lệnh của tôi bị lỗi. Theo tài liệu, theo mặc định, :row_end
phải là :auto
, phải chấp nhận \r\n
hoặc \n
(trong 1.9.2). Tôi đã thử sử dụng Ruby 1.8.7, 1.9.2 và FasterCSV với 1.8.7. Tôi nhận được thông báo lỗi khác nhau với những cố gắng khác nhau, bao gồmRuby CSV không hiểu r n là hàng cuối
CSV::IllegalFormatError
- lĩnh vực không thể viện chứng không cho phép
\r
hay\n
(dòng 1) (FasterCSV::MalformedCSVError
) - không thể dup
NilClass
(TypeError)
trong 1.9.2. (Các \r
không phải là trong một lĩnh vực, đó là sự kết thúc của dòng!) Các dữ liệu trước đây trông như thế này:
03-12-2012 07:59,120.0,
03-11-2012 08:27,120.0,
03-10-2012 07:57,120.0,
Bây giờ nó trông như thế này:
03-12-2012 07:59,120.0,^M
03-11-2012 08:27,120.0,^M
03-10-2012 07:57,120.0,^M
Nghĩ rằng CSV có thể nghĩ các ^M
là trong lĩnh vực cuối cùng, tôi đã cố gắng thêm một dấu phẩy khác:
03-12-2012 07:59,120.0,,^M
vô ích.
Điều duy nhất tôi có thể tưởng tượng là CSV yêu cầu tất cả các trường phải nằm trong dấu ngoặc kép? Tôi có thể nghĩ về các cách giải quyết khác nhau, chẳng hạn như đọc tập tin đầu tiên, chomping kết thúc, sau đó xử lý mảng với CSV, nhưng trước tiên tôi muốn tìm hiểu những gì tôi đang làm sai. Có vẻ như nó sẽ hoạt động.
Bằng cách mã của tôi chỉ đơn giản là:
CSV.foreach(File.join($import_dir, file)) do |record|
và tôi đã cố gắng thiết lập :row_end => "\r\n"
vô ích.
Tôi đang sử dụng Mac OS X 10.6.8.
Cảm ơn lời khuyên. Đã không nghĩ đến việc nhìn vào tập tin với od. Tắt dòng kết thúc bằng \ r \ r \ n. – chetstone