2011-04-29 33 views
16

Tengo una serie de palabras en las que intento eliminar cualquier espacio en blanco que pueda existir al principio de la palabra en lugar de al final. rstrip! solo se ocupa del final de una cadena.Ruby: eliminar caracteres en blanco al comienzo de una cadena

example_array = ['peanut', ' butter', 'sammiches'] 
desired_output = ['peanut', 'butter', 'sammiches'] 

Como se puede ver, no todos los elementos de la matriz tienen el problema de espacio en blanco, por lo que no se puede simplemente eliminar el primer carácter como lo haría si todos los elementos comenzado con un solo espacio en blanco carbón.

código completo:

words = params[:word].gsub("\n", ",").delete("\r").split(",") 
words.delete_if {|x| x == ""} 
words.each do |e| 
    e.lstrip! 
end 

texto de ejemplo que un usuario puede introducir en el formulario:

Corn on the cob, 
Fibonacci, 
StackOverflow 
Chat, Meta, About 
Badges 
Tags,, 
Unanswered 
Ask Question 
+1

Mi primera pregunta es, ¿cómo está creando esas matrices? ¿Al dividir alguna otra cadena usando la extracción de subcadenas? Si es así, es posible que desee mostrar ese código y podemos ayudar a solucionar la causa raíz. –

+0

Acabo de agregar el código completo anterior. :) –

+1

¿Puedes proporcionar algo de texto de muestra también? –

Respuesta

27

String#lstrip (o String#lstrip!) es what you're after.

desired_output = example_array.map(&:lstrip) 

más comentarios acerca de su código:

  1. delete_if {|x| x == ""} pueden ser reemplazados por delete_if(&:empty?)
  2. Excepto desea reject! porque delete_if sólo devolverá una matriz diferente, en lugar de modificar el existente.
  3. words.each {|e| e.lstrip!} pueden ser sustituidos por words.each(&:lstrip!)
  4. delete("\r") debe ser redundante si está leyendo un documento de texto al estilo de ventanas en una máquina Windows, o un documento de tipo UNIX en una máquina Unix
  5. split(",") se puede sustituir por split(", ") o split(/, */) (o /, ?/ si no debería haber como máximo un espacio)

Así que ahora que parece:

words = params[:word].gsub("\n", ",").split(/, ?/) 
words.reject!(&:empty?) 
words.each(&:lstrip!) 

Podría darle más consejos si tuviera el texto de muestra disponible.

Editar: Ok, aquí va:

temp_array = text.split("\n").map do |line| 
    fields = line.split(/, */) 
    non_empty_fields = fields.reject(&:empty?) 
end 
temp_array.flatten(1) 

Los métodos utilizados son String#split, Enumerable#map, Enumerable#reject y Array#flatten.

Ruby también tiene bibliotecas para analizar archivos separados por comas, pero creo que son un poco diferentes entre 1.8 y 1.9.

+1

¡Claro! Me siento como un idiota. Escaneé rdocs una y otra vez y no lo vi. –

+2

solo para agregar ... String.strip se ocupará de los espacios en blanco iniciales y finales – Vic

+1

O simplemente 'a.each (&: lstrip!)' Si desea modificar su matriz en su lugar. –

9
> ' string '.lstrip.chop 
=> "string" 

tiras de ambos espacios en blanco ...

+4

¿Qué tal 'string' .lstrip.rstrip as .chop eliminará un carácter del final –

+7

para el comentario de David: simplemente podemos usar '.strip' para obtener el mismo resultado de' .lstrip.rstrip' http: // ruby -doc.org/core-2.2.2/String.html#method-i-strip –

+0

Considere editar su respuesta para agregar una actualización que corrija su respuesta original. –

Cuestiones relacionadas