2012-07-03 29 views

Respuesta

71
["10", "20", "50","99"].map(&:inspect).join(', ') # => '"10", "20", "50", "99"' 
+4

'map {| v | v.to_s.inspect} 'manejaría ambos valores enteros y cadenas. – tadman

+0

¿Qué sucede cuando los elementos de la matriz contienen '" '? – dbenhur

+0

' ["10", ''] mapa (&: inspeccionar) .join (',') # => '"10", ""' ' – sczizzo

16

aquí:

array.map {|str| "\"#{str}\""}.join(',') 
+0

obtuve esta salida => "\" 10 \ ", \" 20 \ ", \" 50 \ ", \" 99 \ "" – Kashiftufail

+4

Esa salida es correcta. Las barras invertidas simplemente indican que es una cita literal, no una cita de sintaxis. – tadman

+2

@ali: esa es la salida correcta. el '\' es el carácter de escape así que '\" 'representa el caracter' "' mientras que el simple '" 'al principio y al final es el delimitador de cadena. Probablemente está imprimiendo el resultado con' px' que es equivalente a 'puts x.inspect', intente' puts x' en su lugar –

102

array.join(',') casi hacer Lo que quieras; no retendrá las comillas alrededor de los valores ni los espacios posteriores.

Para conservar las comillas y espacios: array.map{|item| %Q{"#{item}"}}.join(', ') Esto imprimirá "\"10\", \"20\", \"50\", \"99\"". Las citas escapadas son necesarias suponiendo que la pregunta de hecho requiere una sola cadena.

Documentación en el %Q: string literals.

Usted podría utilizar inspect como suggested in another answer, yo diría que es la preferencia personal. No lo haría, mire el source code para eso y elíjalo usted mismo.

Útil a un lado: array.to_sentence le dará una salida de estilo "1, 2, 3 y 4", ¡que puede ser agradable!

+0

por curiosidad, ¿puede poner la coma de Oxford allí también? – eds

+5

No, no, no. Unirse no le dará cotizaciones. – Linuxios

+7

Y solo una nota, 'to_sentence' solo existe en Rails desde ActiveSupport. – Linuxios

9

Varias respuestas han ofrecido soluciones utilizando #map, #inspect, #join. Todos ellos fallan al obtener ciertos detalles de la codificación CSV correctos para casos extremos que involucran comas incrustadas y/o delimitadores de cadenas en los elementos.

Probablemente sea una mejor idea usar la clase stdlib CSV y luego hacer la suya.

irb> require 'csv' 
=> true 
irb> a = [10,'1,234','J.R. "Bob" Dobbs',3.14159] 
=> [10, "1,234", "J.R. \"Bob\" Dobbs", 3.14159] 
irb> puts a.to_csv 
10,"1,234","J.R. ""Bob"" Dobbs",3.14159 

Las soluciones map.join son suficientes si esta codificación no tiene que preocuparse por delimitadores embebidos, o debe usarse únicamente para alguna representación interna, pero se producirá un error si la generación de datos para el intercambio con otros programas que esperan Valores separados por comas (CSV) como una representación generalmente comprendida.

+0

Creo que solo quiere esa representación de cadena, no llena CSV. – Linuxios

+0

es bueno generar un String de una matriz que luego otra vez se puede exportar como en el campo de un archivo CSV, entre otros valores – jethroo

Cuestiones relacionadas