2012-03-07 2 views
10

Я читаю от правительства текстового файла, в котором $ используется в качестве разделителя, но я не думаю, что разделителем вопросов характера ...Почему Ruby String # split не обрабатывает последовательные ограничивающие разделители как отдельные объекты?

Так что, как ожидается:

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

В файлы данные Я работаю с, в заголовках столбцов строки (первая строка) равномерно заполнены, то есть нет пустого заголовка, как в:

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

Тем не менее, каждая строка может иметь последовательные разделители хвостовые, такие как:

"w$x$$\r\n" 

Обычно я читаю каждую строку и chomp it. Но это приводит строки # расколоть для лечения последних двух разделителей в один столбец:

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

Не делает Chomp получает мне желаемый результат, хотя я должен грызть последний элемент:

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

Так как Я должен:

  • Chomp линии если окончательные, не символы перевода строки не являются последовательными разделителями
  • сохранить символ новой строки, делать раскол, а затем грызть последний элемент IF конечные символы являются последовательным разделителем

Это кажется очень неудобно ... я что-то пропустил?

ответ

16

Вам необходимо передать отрицательное значение в качестве второго параметра в split. Это предотвращает его от подавления завершающих нулевых полей:

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

the docs on split См.

+0

Спасибо ... за запись, документы - это то место, где я впервые поехал, но я увидел псевдоним «предел» для второго параметра, мой разум решил выключить себя и не прочитать, чтобы увидеть все варианты, кроме положительных числа. Благодаря! – Zando

Смежные вопросы