Zusätzlich zu Roberts Antwort.
In Elixir können Sie verwenden: String.split(string, "\n")
Ansehen Saite Modul.
Frage
Gibt es eine Möglichkeit, einen Bitstring zu teilen, der aus einer Datei auf Newlines geladen wurde? Ich habe so etwas:
A line of text
Additional line of text
And another line
Und ich möchte ein Array wie dieses:
["A line of text",
"Additional line of text",
"And another line"]
Gibt es eine Funktion, um den Text auf Newlines zu teilen, um so etwas wie dieses Array zu produzieren?
Danke im Voraus.
Lösung
Zusätzlich zu Roberts Antwort.
In Elixir können Sie verwenden: String.split(string, "\n")
Ansehen Saite Modul.
Andere Tipps
Ansehen binary:split/2/3
im Modul binär. Zum Beispiel mit binary:split(String, <<"\n">>)
.
Wenn Sie einfach eine Zeichenfolge einteilen \n
, Es gibt einige schwerwiegende Portabilitätsprobleme. Dies liegt daran, dass viele Systeme verwenden \n
, einige verwenden ältere Macs \r
und Windows verwendet \r\n
neue Zeilen abgrenzen.
Die sicherere Möglichkeit, es zu tun, wäre, einen Regex zu verwenden, um eine der drei oben genannten Möglichkeiten abzustimmen:String.split(str, ~r{(\r\n|\r|\n)}
.
Während Mark mit den Portabilitätsproblemen Recht hat, enthält der von ihm bereitgestellte Regex einen Tippfehler und funktioniert als Ergebnis nicht für \r\n
Sequenzen. Hier ist eine einfachere Version, die alle 3 Fälle übernimmt:
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"]
Ich bin kürzlich auf eine Situation gestoßen, in der ich die Lösung in meiner anderen Antwort Und im Grunde war jede andere Lösung, die von den regulären Ausdrücken abhängt, in einigen Situationen viel langsamer als abhängig von der binären Split, insbesondere wenn die Menge der Teile eingeschränkt wurde, in die die Saite geteilt wird. Du kannst sehen https://github.com/crowdhailer/server_sent_event.ex/pull/11 Für eine detailliertere Analyse und einen Benchmark.
Sie können verwenden :binary.split/3
Auch wenn sich verschiedene Arten neuer Zeilenzeichen ansprechen:
iex(1)> "aaa\rbbb\nccc\r\nddd" |> :binary.split(["\r", "\n", "\r\n"], [:global])
["aaa", "bbb", "ccc", "ddd"]
Wie Sie im obigen Beispiel sehen können, ist das Match gierig und \r\n
nimmt Vorrang vor der Aufteilung durch \r
Zuerst und dann \n
.