README.md

# 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.