| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell98 |
Data.Spreadsheet
Contents
Synopsis
- type T = [[String]]
- fromString :: Char -> Char -> String -> Exceptional UserMessage T
- fromStringWithRemainder :: Char -> Char -> String -> Exceptional UserMessage (T, String)
- fromStringSimple :: Char -> Char -> String -> T
- type UserMessage = String
- toString :: Char -> Char -> T -> String
- toStringSimple :: Char -> Char -> T -> String
Documentation
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.
type UserMessage = String Source #
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))