-1

複数行のファイルを読み取り、次のコードでリストに変換しました。

Lines = string:tokens(erlang:binary_to_list(Binary), "\n"),

それを文字列に変換して、いくつかの作業を行いました。

Flat = string:join(Lines, "\r\n"),

文字列の作業が終了したので、それを複数行のリストに戻す必要があります。上記の最初のスニペットを繰り返してみましたが、うまくいきませんでした。string:join を試してみましたが、うまくいきませんでした。以前と同じようにリストに(現在は変更されていますが)?

4

3 に答える 3

1

用語が混乱しています。任意の言語の文字列は、人間が読める文字に対応する整数値のシーケンスです。値の表現がバイナリであるかリストであるかは関係ありませんが、データが含まれているため、どちらも技術的には文字列です。

そうは言っても、最初の一連の命令でバイナリ文字列をリスト文字列に変換しました。リストをバイナリに変換するには、を呼び出すerlang:list_to_binary/1erlang:iolist_to_binary/1、リストがフラットでない場合に呼び出すことができます。例えば:

BinString = <<"this\nis\na\nstring">>.
ListString = "this\nis\na\nstring" = binary_to_list(BinString).
Words = ["this", "is", "a", "string"] = string:tokens(ListString, "\n").
<<"thisisastring">> = iolist_to_binary(Words).
Rejoined = "this\r\nis\r\na\r\nstring" = string:join(Words, "\r\n").
BinAgain = <<"this\r\nis\r\na\r\nstring">> = list_to_binary(Rejoined).

参考までに、stringモジュールは常にstring:joinフラットリスト(たとえば、「this is a string」を期待しますが、["this"、 "is"、 "a"、 "string"]は期待しません)。フラットストリング。

于 2013-01-24T15:59:30.650 に答える
1

上記の最初のスニペットには、erlang:binary_to_list/1最初にバイナリを文字列 (リスト) に変換するへの呼び出しが含まれてstring:tokens/2いますstring:join/2。あなたが書いたようにtokensthenを実行した結果は、 で区切られた行を含む文字列から、 で区切られた行を含む文字列に変換するようです。これは文字のフラットなリストであることに注意してください。join\n\r\n

これはあなたが意図したものですか?

今すべきことは、「複数行のリストに戻す必要がある」という意味によって異なります。単一の文字リスト (文字列) のすべてを意味しますか、それとも各行が文字のリスト (文字列) であるネストされた行のリストのすべてを意味しますか。つまり、あなたがで終わった場合

"here is line 1\r\nhere is line 2\r\nhere is line 3\r\n"

これはすでに複数行のリストです。

["here is line 1","here is line 2","here is line 3"]

各「文字列」自体が文字のリストであることに注意してください。その後どうするつもりですか?

于 2013-01-24T15:06:39.623 に答える
1

それは、フラット化された文字列に加えた変更によって異なります。 string:tokens/2指定したセパレーターを使用して、常に文字列を分解します。したがって、変換が特定の文字列を個々の部分文字列間のセパレータとして保持する限り、問題はありません。

ただし、変換でより精巧で破壊的なことを行う場合、唯一の方法は、文字列を手動で繰り返し処理し、個々の部分文字列を構築することです。

于 2013-01-24T13:24:29.810 に答える