Почему Ruby String # split не обрабатывает последовательные ограничивающие разделители как отдельные объекты?

Я читаю из правительственного текстового файла, в котором $используется как разделитель, но я не думаю, что символ разделителя имеет значение...

Итак, это ожидается:

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

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

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

Однако каждая строка может иметь последовательные ограничивающие разделители, такие как:

"w$x$$\r\n"

Обычно я читаю каждую строку и chomp. Но это приводит к тому, что String # split обрабатывает последние два разделителя как один столбец:

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

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

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

Так или я должен:

  • chomp строка , если конечные символы без символа новой строки НЕ являются последовательными разделителями
  • сохранить новую строку, выполнить разделение, а затем сжать последний элемент, если конечные символы являются последовательными разделителями.

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

Ответ 1

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

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

Смотрите документы на split.