| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Pipes.Csv
Contents
Description
This module allows constant-space CSV parsing.
It feeds ByteStrings into cassavas incremental CSV parser to attain true
constant-space record streaming.
Synopsis
- decode :: (Monad m, FromRecord a) => HasHeader -> Producer ByteString m () -> Producer (Either String a) m ()
- decodeWith :: (Monad m, FromRecord a) => DecodeOptions -> HasHeader -> Producer ByteString m () -> Producer (Either String a) m ()
- decodeByName :: (Monad m, FromNamedRecord a) => Producer ByteString m () -> Producer (Either String a) m ()
- decodeByNameWith :: (Monad m, FromNamedRecord a) => DecodeOptions -> Producer ByteString m () -> Producer (Either String a) m ()
- feedParser :: Monad m => Parser a -> Producer ByteString m () -> Producer (Either String a) m ()
- feedHeaderParser :: Monad m => HeaderParser (Parser a) -> Producer ByteString m () -> Producer (Either String a) m ()
- encode :: (Monad m, ToRecord a) => Pipe a ByteString m r
- encodeWith :: (Monad m, ToRecord a) => EncodeOptions -> Pipe a ByteString m r
- encodeByName :: (Monad m, ToNamedRecord a) => Header -> Pipe a ByteString m r
- encodeByNameWith :: (Monad m, ToNamedRecord a) => EncodeOptions -> Header -> Pipe a ByteString m r
- defaultEncodeOptions :: EncodeOptions
- data EncodeOptions
- (.=) :: ToField a => ByteString -> a -> (ByteString, ByteString)
- (.:) :: FromField a => NamedRecord -> ByteString -> Parser a
- (.!) :: FromField a => Record -> Int -> Parser a
- class FromRecord a where
- parseRecord :: Record -> Parser a
- class ToRecord a where
- class FromNamedRecord a where
- parseNamedRecord :: NamedRecord -> Parser a
- class ToNamedRecord a where
- toNamedRecord :: a -> NamedRecord
- class FromField a where
- parseField :: Field -> Parser a
- class ToField a where
- defaultDecodeOptions :: DecodeOptions
- data DecodeOptions
- type Record = Vector Field
- type Header = Vector Name
- type NamedRecord = HashMap ByteString ByteString
- type Field = ByteString
- data HasHeader
Example
Heres a simple example that reads from stdin and writes to a file
import Pipes.Safe (runSafeT)
import qualified Pipes.Safe.Prelude as PS
import qualified Pipes.ByteString as PB
import Data.Vector (fromList)
import System.IO (IOMode(WriteMode))
data Person = Person String Int
deriving (Show)
instance FromNamedRecord Person where
parseNamedRecord p =
Person <$> p .: "name"
<*> p .: "age"
personRec ~(Person name age) = ["name" .= name, "age" .= age]
instance ToNamedRecord Person where
toNamedRecord = namedRecord . personRec
persons :: Monad m => Producer ByteString m () -> Producer Person m ()
persons p = decodeByName p >-> right
-- note: right can be replaced with Pipes.Prelude.concat in ghc-7.8,
-- thanks to a Foldable instance for Either
right :: (Monad m) => Pipe (Either a b) b m r
right = loop
where
loop = await >>= s -> case s of
Left _ -> loop
Right v -> yield v >> loop
write f = PS.withFile f WriteMode PB.toHandle
main = runSafeT $ runEffect $ pipeline
where
header = fromList $ map fst $ personRec undefined
pipeline = persons stdin
>-> right
>-> encodeByName header
>-> write "persons_out.csv"
Decode records
decode :: (Monad m, FromRecord a) => HasHeader -> Producer ByteString m () -> Producer (Either String a) m () #
Equivalent to .decodeWith defaultDecodeOptions
decodeWith :: (Monad m, FromRecord a) => DecodeOptions -> HasHeader -> Producer ByteString m () -> Producer (Either String a) m () #
Create a Producer that takes a ByteString Producer as input,
producing either errors or FromRecords.
Decode named records
decodeByName :: (Monad m, FromNamedRecord a) => Producer ByteString m () -> Producer (Either String a) m () #
Equivalent to .decodeByNameWith defaultDecodeOptions
decodeByNameWith :: (Monad m, FromNamedRecord a) => DecodeOptions -> Producer ByteString m () -> Producer (Either String a) m () #
Create a Producer that takes a ByteString Producer as input,
producing either errors or FromNamedRecords.
Decode parsed records
feedParser :: Monad m => Parser a -> Producer ByteString m () -> Producer (Either String a) m () #
Create a Record Producer by feeding ByteStrings into a Parser
feedHeaderParser :: Monad m => HeaderParser (Parser a) -> Producer ByteString m () -> Producer (Either String a) m () #
Create a NamedRecord Producer by feeding ByteStrings into a Parser
Encode records
encode :: (Monad m, ToRecord a) => Pipe a ByteString m r #
Encode records as strict ByteStrings
encodeWith :: (Monad m, ToRecord a) => EncodeOptions -> Pipe a ByteString m r #
Encode records as strict ByteStrings
Encode named records
encodeByName :: (Monad m, ToNamedRecord a) => Header -> Pipe a ByteString m r #
Encode named records as strict ByteStrings
encodeByNameWith :: (Monad m, ToNamedRecord a) => EncodeOptions -> Header -> Pipe a ByteString m r #
Encode named records as strict ByteStrings
Re-exports
Data.Csv re-exports common types and operators:
FromRecord,FromNamedRecord,ToRecord,ToNamedRecordToField,FromFieldRecord,Field,NamedRecord- '(.!)', '(.:)', '(.=)'
DecodeOptions,defaultDecodeOptions
defaultEncodeOptions :: EncodeOptions #
Encoding options for CSV files.
data EncodeOptions #
Options that controls how data is encoded. These options can be used to e.g. encode data in a tab-separated format instead of in a comma-separated format.
To avoid having your program stop compiling when new fields are
added to EncodeOptions, create option records by overriding
values in defaultEncodeOptions. Example:
myOptions = defaultEncodeOptions {
encDelimiter = fromIntegral (ord '\t')
}N.B. The encDelimiter must not be the quote character (i.e.
") or one of the record separator characters (i.e. \n or
\r).
Instances
| Eq EncodeOptions | |
Defined in Data.Csv.Encoding Methods (==) :: EncodeOptions -> EncodeOptions -> Bool # (/=) :: EncodeOptions -> EncodeOptions -> Bool # | |
| Show EncodeOptions | |
Defined in Data.Csv.Encoding Methods showsPrec :: Int -> EncodeOptions -> ShowS # show :: EncodeOptions -> String # showList :: [EncodeOptions] -> ShowS # | |
(.=) :: ToField a => ByteString -> a -> (ByteString, ByteString) #
Alias for namedField.
(.:) :: FromField a => NamedRecord -> ByteString -> Parser a #
Alias for lookup.
class FromRecord a where #
A type that can be converted from a single CSV record, with the possibility of failure.
When writing an instance, use empty, mzero, or fail to make a
conversion fail, e.g. if a Record has the wrong number of
columns.
Given this example data:
John,56 Jane,55
here's an example type and instance:
data Person = Person { name :: !Text, age :: !Int }
instance FromRecord Person where
parseRecord v
| length v == 2 = Person <$>
v .! 0 <*>
v .! 1
| otherwise = mzeroMinimal complete definition
Nothing
Methods
parseRecord :: Record -> Parser a #
Instances
A type that can be converted to a single CSV record.
An example type and instance:
data Person = Person { name :: !Text, age :: !Int }
instance ToRecord Person where
toRecord (Person name age) = record [
toField name, toField age]Outputs data on this form:
John,56 Jane,55
Minimal complete definition
Nothing
Instances
class FromNamedRecord a where #
A type that can be converted from a single CSV record, with the possibility of failure.
When writing an instance, use empty, mzero, or fail to make a
conversion fail, e.g. if a Record has the wrong number of
columns.
Given this example data:
name,age John,56 Jane,55
here's an example type and instance:
{-# LANGUAGE OverloadedStrings #-}
data Person = Person { name :: !Text, age :: !Int }
instance FromNamedRecord Person where
parseNamedRecord m = Person <$>
m .: "name" <*>
m .: "age"Note the use of the OverloadedStrings language extension which
enables ByteString values to be written as string literals.
Minimal complete definition
Nothing
Methods
parseNamedRecord :: NamedRecord -> Parser a #
Instances
| (FromField a, FromField b, Ord a) => FromNamedRecord (Map a b) | |
Defined in Data.Csv.Conversion Methods parseNamedRecord :: NamedRecord -> Parser (Map a b) # | |
| (Eq a, FromField a, FromField b, Hashable a) => FromNamedRecord (HashMap a b) | |
Defined in Data.Csv.Conversion Methods parseNamedRecord :: NamedRecord -> Parser (HashMap a b) # | |
class ToNamedRecord a where #
A type that can be converted to a single CSV record.
An example type and instance:
data Person = Person { name :: !Text, age :: !Int }
instance ToNamedRecord Person where
toNamedRecord (Person name age) = namedRecord [
"name" .= name, "age" .= age]Minimal complete definition
Nothing
Instances
| (ToField a, ToField b, Ord a) => ToNamedRecord (Map a b) | |
Defined in Data.Csv.Conversion Methods toNamedRecord :: Map a b -> NamedRecord # | |
| (Eq a, ToField a, ToField b, Hashable a) => ToNamedRecord (HashMap a b) | |
Defined in Data.Csv.Conversion Methods toNamedRecord :: HashMap a b -> NamedRecord # | |
A type that can be converted from a single CSV field, with the possibility of failure.
When writing an instance, use empty, mzero, or fail to make a
conversion fail, e.g. if a Field can't be converted to the given
type.
Example type and instance:
{-# LANGUAGE OverloadedStrings #-}
data Color = Red | Green | Blue
instance FromField Color where
parseField s
| s == "R" = pure Red
| s == "G" = pure Green
| s == "B" = pure Blue
| otherwise = mzeroMethods
parseField :: Field -> Parser a #
Instances
| FromField Char | Assumes UTF-8 encoding. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Char # | |
| FromField Double | Accepts same syntax as |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Double # | |
| FromField Float | Accepts same syntax as |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Float # | |
| FromField Int | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Int # | |
| FromField Int8 | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Int8 # | |
| FromField Int16 | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Int16 # | |
| FromField Int32 | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Int32 # | |
| FromField Int64 | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Int64 # | |
| FromField Integer | Accepts a signed decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Integer # | |
| FromField Natural | Accepts an unsigned decimal number. Ignores whitespace. Since: cassava-0.5.1.0 |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Natural # | |
| FromField Word | Accepts an unsigned decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Word # | |
| FromField Word8 | Accepts an unsigned decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Word8 # | |
| FromField Word16 | Accepts an unsigned decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Word16 # | |
| FromField Word32 | Accepts an unsigned decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Word32 # | |
| FromField Word64 | Accepts an unsigned decimal number. Ignores whitespace. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Word64 # | |
| FromField () | Ignores the |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser () # | |
| FromField ByteString | |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser ByteString # | |
| FromField ByteString | |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser ByteString # | |
| FromField Text | Assumes UTF-8 encoding. Fails on invalid byte sequences. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Text # | |
| FromField Text | Assumes UTF-8 encoding. Fails on invalid byte sequences. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Text # | |
| FromField ShortByteString | |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser ShortByteString # | |
| FromField Scientific | Accepts the same syntax as Since: cassava-0.5.1.0 |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser Scientific # | |
| FromField ShortText | Assumes UTF-8 encoding. Fails on invalid byte sequences. Since: cassava-0.5.0.0 |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser ShortText # | |
| FromField [Char] | Assumes UTF-8 encoding. Fails on invalid byte sequences. |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser [Char] # | |
| FromField a => FromField (Maybe a) | |
Defined in Data.Csv.Conversion Methods parseField :: Field -> Parser (Maybe a) # | |
| FromField a => FromField (Either Field a) | |
Defined in Data.Csv.Conversion | |
A type that can be converted to a single CSV field.
Example type and instance:
{-# LANGUAGE OverloadedStrings #-}
data Color = Red | Green | Blue
instance ToField Color where
toField Red = "R"
toField Green = "G"
toField Blue = "B"Instances
| ToField Char | Uses UTF-8 encoding. |
Defined in Data.Csv.Conversion | |
| ToField Double | Uses decimal notation or scientific notation, depending on the number. |
Defined in Data.Csv.Conversion | |
| ToField Float | Uses decimal notation or scientific notation, depending on the number. |
Defined in Data.Csv.Conversion | |
| ToField Int | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Int8 | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Int16 | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Int32 | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Int64 | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Integer | Uses decimal encoding with optional sign. |
Defined in Data.Csv.Conversion | |
| ToField Natural | Uses decimal encoding. Since: cassava-0.5.1.0 |
Defined in Data.Csv.Conversion | |
| ToField Word | Uses decimal encoding. |
Defined in Data.Csv.Conversion | |
| ToField Word8 | Uses decimal encoding. |
Defined in Data.Csv.Conversion | |
| ToField Word16 | Uses decimal encoding. |
Defined in Data.Csv.Conversion | |
| ToField Word32 | Uses decimal encoding. |
Defined in Data.Csv.Conversion | |
| ToField Word64 | Uses decimal encoding. |
Defined in Data.Csv.Conversion | |
| ToField ByteString | |
Defined in Data.Csv.Conversion Methods toField :: ByteString -> Field # | |
| ToField ByteString | |
Defined in Data.Csv.Conversion Methods toField :: ByteString -> Field # | |
| ToField Text | Uses UTF-8 encoding. |
Defined in Data.Csv.Conversion | |
| ToField Text | Uses UTF-8 encoding. |
Defined in Data.Csv.Conversion | |
| ToField ShortByteString | |
Defined in Data.Csv.Conversion Methods toField :: ShortByteString -> Field # | |
| ToField Scientific | Uses decimal notation or scientific notation, depending on the number. Since: cassava-0.5.1.0 |
Defined in Data.Csv.Conversion Methods toField :: Scientific -> Field # | |
| ToField ShortText | Uses UTF-8 encoding. Since: cassava-0.5.0.0 |
Defined in Data.Csv.Conversion | |
| ToField [Char] | Uses UTF-8 encoding. |
Defined in Data.Csv.Conversion | |
| ToField a => ToField (Maybe a) | |
Defined in Data.Csv.Conversion | |
defaultDecodeOptions :: DecodeOptions #
Decoding options for parsing CSV files.
data DecodeOptions #
Options that controls how data is decoded. These options can be used to e.g. decode tab-separated data instead of comma-separated data.
To avoid having your program stop compiling when new fields are
added to DecodeOptions, create option records by overriding
values in defaultDecodeOptions. Example:
myOptions = defaultDecodeOptions {
decDelimiter = fromIntegral (ord '\t')
}Instances
| Eq DecodeOptions | |
Defined in Data.Csv.Parser Methods (==) :: DecodeOptions -> DecodeOptions -> Bool # (/=) :: DecodeOptions -> DecodeOptions -> Bool # | |
| Show DecodeOptions | |
Defined in Data.Csv.Parser Methods showsPrec :: Int -> DecodeOptions -> ShowS # show :: DecodeOptions -> String # showList :: [DecodeOptions] -> ShowS # | |
The header corresponds to the first line a CSV file. Not all CSV files have a header.
type NamedRecord = HashMap ByteString ByteString #
A record corresponds to a single line in a CSV file, indexed by the column name rather than the column index.
type Field = ByteString #
A single field within a record.