将列表写入文件 elixir

Leg*_*ack 1 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
Run Code Online (Sandbox Code Playgroud)

这是模块中 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: 
Run Code Online (Sandbox Code Playgroud)

这是我弄乱它来测试它的地方:

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])
Run Code Online (Sandbox Code Playgroud)

而在循环中,我也尝试了 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")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么。我也试过 binwrite ,但给出了同样的错误。

Ale*_*kin 5

IO.write/2期望参数为 a chardata | String.Chars.t。它在内部调用 Erlang 的:io.put_chars/2.

列表没有魔法转换[1]到 chardata "[1]",列表被视为字符列表并且[123, 234]是无效的 unicode 序列。看:

iex> IO.write(file, [65, 66, 67])
:ok
Run Code Online (Sandbox Code Playgroud)

你在文件中得到的是ABC因为65A.

回到如何吐出整数列表:您应该将输入转换为实现String.Chars协议的内容:

iex> IO.write(file, inspect(whatever))
:ok
Run Code Online (Sandbox Code Playgroud)

在文件本身中,您将获得:

[123, 234, 6324]
Run Code Online (Sandbox Code Playgroud)