2011-10-18 35 views
6

Tôi có thể xuất dữ liệu bảng thành tệp CSV, tuy nhiên có một hàng trống sau mỗi bản ghi. Tại sao và làm thế nào để tôi sửa nó?đường ray 3.1 tạo tệp CSV

trong index.html.erb

<%= link_to "Export to csv", request.parameters.merge({:format => :csv})%> 

trong index.csv.erb

<%- headers = ["Id", "Name"] -%> 
<%= CSV.generate_line headers %> 
<%- @customers.each do |n| -%> 
<%- row = [ n.id, n.fname ] -%> 
<%= CSV.generate_line row %> 
<%- end -%> 
+1

Tôi đã thử mã của bạn và có vẻ như nó hoạt động. Không có hàng trống sau mỗi bản ghi. Có lẽ bạn cần phải kiểm tra n.fname, bạn có thể có một dòng char mới trong nội dung của trường. –

+0

@MatteoAlessani Dường như không có trong hồ sơ cơ sở dữ liệu. Bất cứ nơi nào khác tôi có thể nhìn? Tôi có thể chỉ tách các dòng mới ra khỏi chuỗi trước khi tạo hàng không? – ctilley79

+0

có, bạn có thể cố gắng loại bỏ chúng hoặc trường. –

Trả lời

6

Đây là những gì đã khắc phục.

<%= CSV.generate_line row, :row_sep => ?\t, :quote_char => ?\ %> 
+0

Tôi muốn biết thêm về mã hóa đó. Tại sao dấu chấm hỏi? – Swards

+0

Từ http://www.tutorialspoint.com/ruby/ruby_variables.htm - Bạn có thể nhận được giá trị số nguyên tương ứng với một ký tự ASCII hoặc chuỗi thoát bằng cách đặt trước nó với dấu chấm hỏi. – Swards

+0

Phương pháp này thêm một số '0' vào cuối mỗi dòng vì một số lý do. Bất kỳ ý tưởng tại sao điều này có thể xảy ra? – mylescc

0

Hãy thử điều này:

row = [ n.id, n.fname.strip ] 

dải sẽ loại bỏ \ r và/hoặc \ n có thể gây ra các dòng trống. Tôi không có bất kỳ giải thích khác sourcecode của bạn là okay!

2

cho tôi sau khi sử dụng dải và html_safe làm việc, áp dụng sau khi liên tiếp được tạo ra:

<%- headers = ["Id", "Tour No"] -%> 
<%= CSV.generate_line(headers).strip%> 
<%- @tours.each do |t| -%> 
<%- row = [ t.id,t.tour_no] -%> 
<%= CSV.generate_line(row).html_safe.strip%> 
<%- end -%> 
0

Tôi nghĩ tôi sẽ trong chip với giải pháp của tôi như vừa được đấu tranh với điều này. Về cơ bản trên máy tính địa phương của tôi (một mac) tất cả mọi thứ đã làm việc hoàn toàn tốt đẹp, sau đó khi tôi triển khai ứng dụng của tôi để heroku nó sẽ bắt đầu thêm vào những hàng mới bí ẩn. Chúc May mắn!

Đối với tôi, giải pháp là sử dụng:

CSV.generate_line(row, row_step: ?\r).html_safe 

Là một lưu ý, tôi đang sử dụng đường ray 4.1.6.

Hy vọng rằng sẽ giúp một số người khác đang gặp khó khăn

6

CSV.generate_line thêm một ký tự dòng mới vào cuối dòng nó tạo ra, nhưng như vậy không <%= %> vì vậy bạn đang nhận được hai dòng mới.

Để ngăn chặn các ký tự dòng mới từ việc sử dụng sản lượng erb biểu hiện cú pháp sau: <%= -%>

vậy:

<%- headers = ["Id", "Name"] -%> 
<%= CSV.generate_line headers -%> 
<%- @customers.each do |n| -%> 
<%- row = [ n.id, n.fname ] -%> 
<%= CSV.generate_line row -%> 
<%- end -%> 

Câu trả lời được chấp nhận lá trong dòng mới được tạo từ erb nhưng ngăn chặn các dòng sản phẩm mới từ CSV.generate_line mà tôi nghĩ không phải là cách tốt nhất để làm điều đó.

+0

Hoàn hảo - cảm ơn bạn rất nhiều – skwidbreth

+0

Đây là câu trả lời hoàn hảo. Ban đầu tôi đã giải quyết vấn đề này với việc sử dụng .html_safe.strip. Điều này làm việc cho đến khi tôi có một chuỗi được trích dẫn kép với dấu phẩy trong đó. Nó làm rối tung tất cả các cột của tôi và đã thua lỗ với giải pháp cho đến khi gặp câu trả lời này. Đề nghị duy nhất của tôi là bạn không cần - trên mọi dòng, nó chỉ phải trên cùng một dòng có =. Cảm ơn bạn rất nhiều! – MTarantini

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