spreadsheet-0.1.3.10: Read and write spreadsheets from and to CSV files in a lazy way
Safe HaskellSafe-Inferred
LanguageHaskell98

Data.Spreadsheet

Synopsis

Documentation

type T = [[String]] Source #

A spreadsheet is a list of lines, each line consists of cells, and each cell is a string. Ideally, spreadsheets read from a CSV file have lines with the same number of cells per line. However, we cannot assert this, and thus we parse the lines as they come in.

parsing

fromString :: Char -> Char -> String -> Exceptional UserMessage T Source #

fromString qm sep text parses text into a spreadsheet, using the quotation character qm and the separator character sep.

>>> Spreadsheet.fromString '"' '\t' "\"hello\"\t\"world\"\n\"end\"\n"
Exceptional {exception = Nothing, result = [["hello","world"],["end"]]}
>>> Spreadsheet.fromString '"' ',' "\"hello,world\",\"really\"\n\"end\"\n"
Exceptional {exception = Nothing, result = [["hello,world","really"],["end"]]}
>>> Spreadsheet.fromString '"' ';' "\"hello \"\"world\"\"\"\n\"really\"\n"
Exceptional {exception = Nothing, result = [["hello \"world\""],["really"]]}
>>> Spreadsheet.fromString '"' ',' "\"hello\nworld\"\n"
Exceptional {exception = Nothing, result = [["hello\nworld"]]}

fromStringWithRemainder :: Char -> Char -> String -> Exceptional UserMessage (T, String) Source #

fromString qm sep text parses text into a spreadsheet and additionally returns text that follows after CSV formatted data.

fromStringSimple :: Char -> Char -> String -> T Source #

This is a quick hack. It does neither handle field nor line separators within quoted fields. You must provide well-formed CSV content without field and line separators within quotations. Everything else yields an error.

formatting

toString :: Char -> Char -> T -> String Source #

>>> Spreadsheet.toString '"' '\t' [["hello","world"],["end"]]
"\"hello\"\t\"world\"\n\"end\"\n"
>>> Spreadsheet.toString '"' ',' [["hello,world","really"],["end"]]
"\"hello,world\",\"really\"\n\"end\"\n"
>>> Spreadsheet.toString '"' ';' [["hello \"world\""],["really"]]
"\"hello \"\"world\"\"\"\n\"really\"\n"
>>> Spreadsheet.toString '"' ',' [["hello\nworld"]]
"\"hello\nworld\"\n"
>>> take 50 $ Spreadsheet.toString '"' ',' $ repeat ["hello","world"]
"\"hello\",\"world\"\n\"hello\",\"world\"\n\"hello\",\"world\"\n\"h"
>>> take 50 $ Spreadsheet.toString '"' ',' [cycle ["hello","world"]]
"\"hello\",\"world\",\"hello\",\"world\",\"hello\",\"world\",\"h"
QC.forAll (QC.elements ";,\t ") $ \sep tableNE ->
   let table = map QC.getNonEmpty tableNE in
   table ==
   MEA.result (Spreadsheet.fromString '"' sep
                  (Spreadsheet.toString '"' sep table))