Почему Ruby String # split не обрабатывает последовательные конечные разделители как отдельные объекты? - PullRequest
11 голосов
/ 07 марта 2012

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

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

'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"]

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

  • сжать строку , если , то последние не-символы новой строки НЕ являются последовательными разделителями
  • сохранить символ новой строки, выполнить разделение, а затем сжать последний элемент, ЕСЛИ последние символы являются последовательным разделителем

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

1 Ответ

18 голосов
/ 07 марта 2012

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

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

См. документы по split.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...