2012-03-07 16 views
10

estoy leyendo desde un archivo de texto gobierno en el que se utiliza como delimitador $, pero no creo delimitador cuestiones de carácter ...¿Por qué Ruby String # split no trata los delimitadores finales consecutivos como entidades separadas?

Así que esto se espera:

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

En el archivos de datos con los que trabajo, la fila de encabezados de columna (la primera línea) se llenan de manera uniforme en, es decir, no hay ninguna cabecera de vacío, como en:

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

sin embargo, cada fila puede tener delimitadores arrastran consecutivos, tales como:

"w$x$$\r\n" 

Normalmente, leo cada línea y chomp. Pero esto hace Cadena # dividida para tratar los últimos dos delimitadores como una columna:

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

No hacer el mordisco me consigue el resultado deseado, aunque debería masticar el último elemento:

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

Así que, o tengo que:

  • Chomp la línea si los caracteres que no sean de nueva línea final no son delimitadores consecutivos
  • preservar el carácter de nueva línea, hacer la división, y luego masticar el elemento final si los caracteres finales son delimitador consecutiva

Esto parece muy incómodo ... Me estoy perdiendo algo aquí?

Respuesta

16

Debe pasar un valor negativo como el segundo parámetro a split. Esto evita que la supresión se arrastran campos nulos:

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

Ver the docs on split.

+0

Gracias ... para el registro, el documento fue donde primero fui, pero vi el "límite" de pseudoname para el segundo parámetro, mi mente decidió apagarse y no leer para ver todas las opciones además de positivas números implicados. ¡Gracias! – Zando

Cuestiones relacionadas