2017-06-28 15 views
2

elixirのファイルにリストを書き込むことができません。リスト全体を書き込もうとするとエラーが発生し、リストを列挙しようとするとエラーが発生します。それは整数のリストです。ファイルに一覧を書き込むelixir

{:ok, file} = File.open "loop_issues.csv", [:write] 
for item <- find_common_items(list_one, list_two) do 
    IO.write(file, item <> ",") 
end  
File.close file 

ここでは、モジュールからのIEX読み取り値の例とそれを再生しています。ここで

commons 
[6579, 9397] 
** (ArgumentError) argument error 
    (autoupgrader_phx) lib/modules/tree_validator.ex:30: anonymous fn/3 in TreeV 
alidator.check_all_users/0 
       (elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (autoupgrader_phx) lib/modules/tree_validator.ex:29: anonymous fn/3 in TreeV 
alidator.check_all_users/0 
       (elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (autoupgrader_phx) lib/modules/tree_validator.ex:14: 

は、私はそれをテストするためにそれをいじりされた場所です。

iex(2)> {:ok, file} = File.open "test_file.txt", [:write] 
{:ok, #PID<0.469.0>} 

iex(3)> whatever = [123, 234, 6324] 
[123, 234, 6324] 

iex(4)> IO.write(file, whatever) 
** (ErlangError) erlang error: :no_translation 
    (stdlib) :io.put_chars(#PID<0.469.0>, :unicode, [123, 234, 6324]) 

そしてループに代わり、私もEnum.reduce試してみました:

iex(4)> for thing <- whatever, do: IO.write(file, thing) 
** (ErlangError) erlang error: :terminated 
    (stdlib) :io.put_chars(#PID<0.469.0>, :unicode, "123") 

を私が間違って何をやっています。私もbinwriteを試みたが、それは同じエラーを与えた。

答えて

5

IO.write/2は、引数がchardata | String.Chars.tであると想定しています。内部的にはErlangの:io.put_chars/2を呼び出します。

リスト[1]をchardata "[1]"にマジック変換すると、リストは文字のリストとして扱われ、[123, 234]は無効なユニコードシーケンスです。見て:

iex> IO.write(file, [65, 66, 67]) 
:ok 

そして、何あなたがファイルで入手65AのUnicode/ASCII値であるためABCです。

うち整数のリストを吐く方に戻って:あなたはString.Charsプロトコル実装して何かに入力を変換する必要があります。

iex> IO.write(file, inspect(whatever)) 
:ok 

をして、ファイル自体にあなたが得られます:

[123, 234, 6324] 
関連する問題