2011-10-18 20 views
6

Sono in grado di esportare i dati della tabella in un file CSV, tuttavia è presente una riga vuota dopo ogni record. Perché e come lo aggiusto?rails 3.1 generazione file CSV

in index.html.erb

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

in 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

Ho provato il codice e sembra funzionare. Nessuna riga vuota dopo ogni record. Forse hai bisogno di ispezionare n.fname, potresti avere una nuova linea char nel contenuto del campo. –

+0

@MatteoAlessani Non sembra essere nei record del database. Ovunque posso guardare? Posso semplicemente rimuovere le nuove righe dalla stringa prima di generare la riga? – ctilley79

+0

sì, puoi provare a spogliarli o sul campo. –

risposta

6

Questo è ciò che ha risolto.

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

Mi piacerebbe saperne di più su tale codifica. Perché il punto interrogativo? – Swards

+0

Da http://www.tutorialspoint.com/ruby/ruby_variables.htm - È possibile ottenere il valore intero corrispondente a un carattere ASCII o sequenza di escape precedendolo con un punto interrogativo. – Swards

+0

Questo metodo aggiunge uno "0" in più alla fine di ogni riga per qualche motivo. Qualche idea sul perché questo potrebbe accadere? – mylescc

0

Prova questo:

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

striscia rimuoverà \ r e/o \ n che potrebbe causare le righe vuote. Non ho altra spiegazione che il tuo codice sorgente sia okay!

2

per me dopo l'uso del nastro e html_safe lavorato, applicato dopo la riga è stata generata:

<%- 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

ho pensato di chip con la mia soluzione, come appena stato alle prese con questo.

Fondamentalmente sulla mia macchina locale (un mac) tutto funzionava perfettamente, quindi quando ho distribuito la mia app su heroku, si sarebbe iniziato ad aggiungere in queste nuove righe misteriose.

Per me la soluzione era quella di utilizzare:

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

Come nota, sto usando le rotaie 4.1.6.

Speranza che aiuta le altre persone che lottano

6

CSV.generate_line aggiunge un carattere di nuova riga alla fine della linea che genera, ma così fa <%= %> in modo che stai ricevendo due nuove linee.

per sopprimere il carattere di nuova riga dall'uso uscita erb espressione questa sintassi: <%= -%>

così:

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

La risposta accettata lascia nella nuova linea generata dal erb ma sopprime la nuova linea da CSV.generate_line che penso non sia il modo migliore per farlo.

+0

Perfetto - grazie mille – skwidbreth

+0

Questa è la risposta perfetta. Inizialmente avevo risolto questo problema con l'uso di .html_safe.strip. Questo ha funzionato fino a quando non ho avuto una stringa doppia citazione con una virgola in esso. Ha incasinato tutte le mie colonne ed era in perdita per la soluzione fino a trovare questa risposta. Il mio unico suggerimento è che non è necessario il - su ogni riga, deve solo essere sulla stessa linea che ha il =. Grazie mille! – MTarantini