2012-03-07 15 views
10

Tôi đang đọc từ một tập tin văn bản của chính phủ, trong đó $ được sử dụng như là dấu phân cách, nhưng tôi không nghĩ rằng delimiter vấn đề nhân vật ...Tại sao Ruby String # split không xử lý các dấu phân tách theo sau liên tiếp dưới dạng các thực thể riêng lẻ?

Vì vậy, đây được dự kiến:

'a$b$c$d'.split('$') 
# => ["a", "b", "c", "d"] 

Trong datafiles tôi đang làm việc với, dòng tiêu đề cột (dòng đầu tiên) đều thống nhất điền vào, tức là không có tiêu đề trống rỗng, như trong:

'a$b$$d' 
# or: 
'a$b$c$' 

Tuy nhiên, mỗi hàng có thể có delimiters dấu liên tiếp như:

"w$x$$\r\n" 

Thông thường, tôi đọc từng dòng và chomp. Nhưng điều này gây ra String # chia để trị hai delimiters cuối cùng như một cột:

"w$x$$\r\n".chomp.split('$') 
# => ["w", "x"] 

Không làm chomp được cho tôi những kết quả mong muốn, mặc dù tôi nên chomp yếu tố cuối cùng:

"w$x$$\r\n".split('$') 
# => ["w", "x", "", "\r\n"] 

Vì vậy, một trong hai tôi phải:

  • chomp dòng nếu các nhân vật phi xuống dòng cuối cùng là kHÔNG delimiters liên tiếp
  • giữ nguyên dòng mới, thực hiện phân tách và sau đó chomp phần tử cuối cùng NẾU các ký tự cuối cùng là dấu phân cách liên tiếp

Điều này có vẻ thực sự khó xử ... Tôi có thiếu thứ gì đó ở đây không?

Trả lời

16

Bạn cần chuyển giá trị âm như tham số thứ hai tới split. Điều này ngăn không cho nó chặn các trường trống theo sau:

"w$x$$\r\n".chomp.split('$', -1) 
# => ["w", "x", "", ""] 

Xem the docs on split.

+0

Cảm ơn ... vì hồ sơ, tài liệu là nơi tôi lần đầu tiên đến, nhưng tôi thấy "giới hạn" giả cho tham số thứ hai, tâm trí của tôi quyết định tự tắt và không đọc qua để xem tất cả các tùy chọn ngoài tích cực số điện thoại đòi hỏi. Cảm ơn! – Zando

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