2012-03-07 22 views
10

Sto leggendo da un file di testo governo in cui $ viene utilizzato come delimitatore, ma non credo che le questioni di carattere delimitatore ...Perché Ruby String # split non considera i delimitatori finali consecutivi come entità separate?

Quindi questo ci si aspetta:

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

Nel datafiles sto lavorando, la riga colonna intestazioni (prima riga) sono uniformemente compilati, cioè non v'è alcuna intestazione vuota, come in:

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

Tuttavia, ogni fila può avere delimitatori consecutivi trascinamento quali:

"w$x$$\r\n" 

Di solito, ho letto ogni riga e chomp it. Ma questo fa sì che String # diviso per trattare gli ultimi due delimitatori come una colonna:

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

non fare la chomp mi ottiene il risultato desiderato, anche se dovrei chomp l'ultimo elemento:

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

Quindi, o devo:

  • chomp la linea se i caratteri finali non nuova riga non sono delimitatori consecutivi
  • preservare il ritorno a capo, fare la scissione, e quindi chomp l'elemento finale se i caratteri finali sono delimitatore consecutivi

Questo sembra davvero imbarazzante ... mi manca qualcosa qui?

risposta

16

È necessario passare un valore negativo come secondo parametro a split. Questo impedisce di sopprimere finali campi nulli:

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

Vedi the docs on split.

+0

Grazie ... per la cronaca, la documentazione è la prima volta che sono andato, ma ho visto il "limite" pseudoname per il secondo parametro, la mia mente ha deciso di chiudersi e non leggere per vedere tutte le opzioni oltre a positive numeri implicati. Grazie! – Zando

Problemi correlati