Эликсир/Эрланг разделил битстрим на строки новой строки?

Есть ли способ разбить битструю, загруженную из файла в строки новой строки? У меня есть что-то вроде этого:

A line of text
Additional line of text
And another line

И я хочу такой массив:

["A line of text",
"Additional line of text",
"And another line"]

Есть ли функция разделить текст на символах новой строки, чтобы создать что-то вроде этого массива?

Спасибо заранее.

Ответ 1

Помимо Робертса отвечу.

В Elixir вы можете использовать: String.split(string, "\n") Посмотрите на модуль String.

Ответ 2

Посмотрите binary:split/2/3 в модуле binary. Например, с помощью binary:split(String, <<"\n">>).

Ответ 3

Если вы просто разбили строку на \n, возникнут серьезные проблемы с переносимостью. Это связано с тем, что во многих системах используется \n, в некоторых, например, в старых macs, используется \r а в Windows используется \r\n для разделения новых строк.

Более безопасный способ сделать это - использовать регулярное выражение для сопоставления с любой из трех указанных выше возможностей: String.split(str, ~r{(\r\n|\r|\n)}.

Ответ 4

Хотя Марк прав насчет проблем с переносимостью, в приведенном им регулярном выражении есть опечатка, и в результате он не работает для последовательностей \r\n. Вот более простая версия, которая обрабатывает все 3 случая:

iex(13)> String.split("foo\nbar", ~r/\R/)
["foo", "bar"]
iex(14)> String.split("foo\rbar", ~r/\R/)
["foo", "bar"]
iex(15)> String.split("foo\r\nbar", ~r/\R/)
["foo", "bar"]

Ответ 5

Недавно я столкнулся с ситуацией, когда решение в моем другом ответе и, в основном, в любом другом решении, зависящем от регулярных выражений, было в некоторых ситуациях намного медленнее, чем в зависимости от двоичного разбиения, особенно при ограничении количества частей, на которые разбивается строка. Вы можете увидеть https://github.com/CrowdHailer/server_sent_event.ex/pull/11 для более подробного анализа и оценки.

Вы можете использовать :binary.split/3 даже при нацеливании на различные типы символов новой строки:

iex(1)> "aaa\rbbb\nccc\r\nddd" |> :binary.split(["\r", "\n", "\r\n"], [:global])     
["aaa", "bbb", "ccc", "ddd"]

Как вы можете видеть в приведенном выше примере, совпадение является жадным, и \r\n имеет приоритет над разбиением сначала на \r а затем \n.