Além da resposta de Roberts.
Em Elixir, você pode usar: String.split(string, "\n")
Olhe para Corda módulo.
Pergunta
Existe uma maneira de dividir uma placa de bits carregada de um arquivo no Newlines? Eu tenho algo assim:
A line of text
Additional line of text
And another line
E eu quero uma matriz como esta:
["A line of text",
"Additional line of text",
"And another line"]
Existe uma função para dividir o texto em novas linhas para produzir algo como essa matriz?
Desde já, obrigado.
Solução
Além da resposta de Roberts.
Em Elixir, você pode usar: String.split(string, "\n")
Olhe para Corda módulo.
Outras dicas
Olhe para binary:split/2/3
no módulo binário. Por exemplo com binary:split(String, <<"\n">>)
.
Se você simplesmente dividir uma corda \n
, existem alguns problemas graves de portabilidade. Isso ocorre porque muitos sistemas usam \n
, alguns como Macs mais velhos usam \r
e o Windows usa \r\n
para delimitar novas linhas.
A maneira mais segura de fazer isso seria usar um regex para corresponder a qualquer uma das três possibilidades acima:String.split(str, ~r{(\r\n|\r|\n)}
.
Enquanto Mark está certo sobre os problemas de portabilidade, o regex que ele forneceu tem um erro de digitação e, como resultado, não funciona \r\n
Sequências. Aqui está uma versão mais simples que lida com todos os 3 casos:
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"]
Recentemente, encontro uma situação onde a solução na minha outra resposta E basicamente qualquer outra solução, dependendo de expressões regulares, foi em algumas situações muito mais lenta do que dependendo da divisão binária, especialmente ao limitar a quantidade de peças em que a corda é dividida. Você pode ver https://github.com/crowdhailer/server_sent_event.ex/pull/11 Para uma análise mais detalhada e uma referência.
Você pode usar :binary.split/3
Mesmo ao atingir diferentes tipos de novos caracteres de linha:
iex(1)> "aaa\rbbb\nccc\r\nddd" |> :binary.split(["\r", "\n", "\r\n"], [:global])
["aaa", "bbb", "ccc", "ddd"]
Como você pode ver no exemplo acima, a partida é gananciosa e \r\n
tem precedência acima da divisão por \r
primeiro e depois \n
.