Ответ 1
Помимо Робертса отвечу.
В Elixir вы можете использовать: String.split(string, "\n")
Посмотрите на модуль String.
Есть ли способ разбить битструю, загруженную из файла в строки новой строки? У меня есть что-то вроде этого:
A line of text
Additional line of text
And another line
И я хочу такой массив:
["A line of text",
"Additional line of text",
"And another line"]
Есть ли функция разделить текст на символах новой строки, чтобы создать что-то вроде этого массива?
Спасибо заранее.
Помимо Робертса отвечу.
В Elixir вы можете использовать: String.split(string, "\n")
Посмотрите на модуль String.
Посмотрите binary:split/2/3
в модуле binary. Например, с помощью binary:split(String, <<"\n">>)
.
Если вы просто разбили строку на \n
, возникнут серьезные проблемы с переносимостью. Это связано с тем, что во многих системах используется \n
, в некоторых, например, в старых macs, используется \r
а в Windows используется \r\n
для разделения новых строк.
Более безопасный способ сделать это - использовать регулярное выражение для сопоставления с любой из трех указанных выше возможностей: String.split(str, ~r{(\r\n|\r|\n)}
.
Хотя Марк прав насчет проблем с переносимостью, в приведенном им регулярном выражении есть опечатка, и в результате он не работает для последовательностей \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"]
Недавно я столкнулся с ситуацией, когда решение в моем другом ответе и, в основном, в любом другом решении, зависящем от регулярных выражений, было в некоторых ситуациях намного медленнее, чем в зависимости от двоичного разбиения, особенно при ограничении количества частей, на которые разбивается строка. Вы можете увидеть 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
.