CSVLixir

A CSV reader/writer for Elixir. Operates on strings and char lists. It'd be very simple to provide file I/O.

The reader takes a string or a char list and returns a list of lists of the same type.

iex> CSVLixir.read("abc,def,ghi\n123,456,789")
[["abc","def","ghi"],["123","456","789"]]
iex> CSVLixir.read('abc,def,"gh"",""i"')
[['abc','def','gh","i"']]
iex> CSVLixir.read(File.read!("foo.csv"))
[["row1", "has", "stuff"],["on", "many lines"]]

The writer takes a list of lists (write) or a list (write_row) and returns a string. The writer always works with strings.

iex> IO.puts CSVLixir.write([["abc", "def", "gh\",\"i"], [123, 456, 789]])
abc,def,"gh"",""i"
123,456,789
iex> CSVLixir.write_row(["abc", "def", "gh\",\"i"])
"abc,def,\"gh\"\",\"\"i\""
iex> CSVLixir.write_row(["abc", "def", "gh\",\"i"]) |> File.write("bar.csv")
:ok

File I/O

If your CSV file can fit into memory, you can easily read the file into a string and pass it into CSVLixir.read. See the example above. The same goes for writing: use CSVLixir.write to create a string from data and write that to a file.

To Do

I'm working on support for Stream I/O, but I'm having problems. CSVLixir needs to read data a character at a time, not a line at a time, since column data can span multiple lines. I may have to do my own buffering.