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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top