This module allows for incremental decoding and encoding of CSV
data. This is useful if you e.g. want to interleave I/O with
parsing or if you want finer grained control over how you deal with
type conversion errors.
Decoding example:
main :: IO ()
main = withFile "salaries.csv" ReadMode $ \ csvFile -> do
let loop !_ (Fail _ errMsg) = putStrLn errMsg >> exitFailure
loop acc (Many rs k) = loop (acc + sumSalaries rs) =<< feed k
loop acc (Done rs) = putStrLn $ "Total salaries: " ++
show (sumSalaries rs + acc)
feed k = do
isEof <- hIsEOF csvFile
if isEof
then return $ k B.empty
else k `fmap` B.hGetSome csvFile 4096
loop 0 (decode NoHeader)
where
sumSalaries rs = sum [salary | Right (_ :: String, salary :: Int) <- rs]
Encoding example:
data Person = Person { name :: !String, salary :: !Int }
deriving Generic
instance FromNamedRecord Person
instance ToNamedRecord Person
instance DefaultOrdered Person
persons :: [Person]
persons = [Person "John" 50000, Person "Jane" 60000]
main :: IO ()
main = putStrLn $ encodeDefaultOrderedByName (go persons)
where
go (x:xs) = encodeNamedRecord x <> go xs
The parser needs more input data before it can produce a
result. Use an empty string to indicate that no more
input data is available. If fed an 'B.empty string', the
continuation is guaranteed to return either FailH or
DoneH.
Like decodeHeader, but lets you customize how the CSV data is
parsed.
Just like in the case of non-incremental decoding, there are two
ways to convert CSV records to and from and user-defined data
types: index-based conversion and name-based conversion.
An incremental parser that when fed data eventually produces some
parsed records, converted to the desired type, or an error in case
of malformed input data.
The parser parsed and converted zero or more records. Any
records that failed type conversion are returned as Left
errMsg and the rest as Right val. Feed a ByteString
to the continuation to continue parsing. Use an empty
string to indicate that no more input data is available. If
fed an empty string, the continuation is guaranteed to
return either Fail or Done.
Efficiently deserialize CSV in an incremental fashion. The data
is assumed to be preceded by a header. Returns a HeaderParser
that when done produces a Parser for parsing the actual records.
Equivalent to decodeByNameWithdefaultDecodeOptions.
A builder for building the CSV data incrementally. Just like the
ByteString builder, this builder should be used in a
right-associative, foldr style. Using <> to compose builders in
a left-associative, foldl' style makes the building not be
incremental.
Instances2Semigroup, Monoid
Semigroup (Buildera)Defined in cassava-0.5.3.2 · Data.Csv.Incremental
Monoid (Buildera)Defined in cassava-0.5.3.2 · Data.Csv.Incremental
Name-based record conversion
See documentation on name-based conversion in Data.Csv for more
information.
Efficiently serialize named records in an incremental fashion,
including the leading header. Equivalent to encodeWithdefaultEncodeOptions. The header is written before any records
and dictates the field order.
A builder for building the CSV data incrementally. Just like the
ByteString builder, this builder should be used in a
right-associative, foldr style. Using <> to compose builders in
a left-associative, foldl' style makes the building not be
incremental.