Haskell 如何使用Attoparsec解析yahoo历史csv

Haskell 如何使用Attoparsec解析yahoo历史csv,haskell,attoparsec,Haskell,Attoparsec,我是haskell的初学者,如何用ATOPASSEC解析成开放数组、高位数组等 module CsvParser ( Quote (..) , csvFile , quote ) where import System.IO import Data.Attoparsec.Text import Data.Attoparsec.Combinator import Data.Text (Text, unpack) import Data.Time import S

我是haskell的初学者,如何用ATOPASSEC解析成开放数组、高位数组等

module CsvParser (
      Quote (..)
    , csvFile
    , quote
    ) where
import System.IO
import Data.Attoparsec.Text
import Data.Attoparsec.Combinator
import Data.Text (Text, unpack)
import Data.Time
import System.Locale
import Data.Maybe

data Quote = Quote {
        qTime       :: LocalTime,
        qAsk        :: Double,
        qBid        :: Double,
        qAskVolume  :: Double,
        qBidVolume  :: Double
    } deriving (Show, Eq)

csvFile :: Parser [Quote]
csvFile = do
    q <- many1 quote
    endOfInput
    return q

quote   :: Parser Quote
quote   = do
    time        <- qtime
    qcomma
    ask         <- double
    qcomma
    bid         <- double
    qcomma
    askVolume   <- double
    qcomma
    bidVolume   <- double
    endOfLine
    return $ Quote time ask bid askVolume bidVolume 

qcomma  :: Parser ()
qcomma  = do 
    char ','
    return ()

qtime   :: Parser LocalTime
qtime   = do
    tstring     <- takeTill (\x -> x == ',')
    let time    = parseTime defaultTimeLocale "%d.%m.%Y %H:%M:%S%Q" (unpack tstring)
    return $ fromMaybe (LocalTime (fromGregorian 0001 01 01) (TimeOfDay 00 00 00 )) time

--testString :: Text
--testString = "01.10.2012 00:00:00.741,1.28082,1.28077,1500000.00,1500000.00\n" 

quoteParser = parseOnly quote

main = do  
    handle <- openFile "C:\\Users\\ivan\\Downloads\\0005.HK.csv" ReadMode  
    contents <- hGetContents handle  
    let allLines = lines contents
    map (\line -> quoteParser line) allLines
    --putStr contents  
    hClose handle
模块CsvParser(
引用(……)
,csvFile
引用
)在哪里
导入系统.IO
导入Data.c.Text
导入Data.c.Combinator
导入数据.Text(文本,解包)
导入数据。时间
导入系统语言环境
导入数据,也许吧
数据报价=报价{
qTime::LocalTime,
qAsk::加倍,
qBid::双倍,
qAskVolume::Double,
qBidVolume::Double
}推导(显示,等式)
csvFile::解析器[引用]
csvFile=do
你可以使用这个软件包,也可以查看一下它,了解如何自己编写

代码如下

import qualified Data.Text.IO as T
import Text.ParseCSV

main = do
  txt <- T.readFile "file.csv"
  case parseCSV txt of
    Left  err -> error err
    Right csv -> mapM_ (print . mkQuote) csv

mkQuote :: [T.Text] -> Quote
mkQuote = error "Not implemented yet"
将限定的Data.Text.IO导入为T
导入Text.csv
main=do
txt错误
右csv->mapM(print.mkQuote)csv
mkQuote::[T.Text]->Quote
mkQuote=错误“尚未实现”

该错误与parsec或attoparsec无关。错误消息指向的行不是一个
IO
操作,因此当您尝试将其作为一个操作使用时,它会导致错误:

main = do  
    handle <- openFile "C:\\Users\\ivan\\Downloads\\0005.HK.csv" ReadMode  
    contents <- hGetContents handle  
    let allLines = lines contents
    map (\line -> quoteParser line) allLines   -- <== This is not an IO action
    --putStr contents  
    hClose handl
main=do

处理这个问题可能重复的地方是关于使用另一个库ATOPASSERC,我在阅读示例后发现很难使用,任何简单的示例如Michael Snoyman在该答案中的建议,您应该使用
csv管道
<代码>csv管道
内部使用
attoparsec
执行解析任务。如果您是Haskell的新手,我建议您从基础开始,然后开始使用这些库。
main = do  
    handle <- openFile "C:\\Users\\ivan\\Downloads\\0005.HK.csv" ReadMode  
    contents <- hGetContents handle  
    let allLines = lines contents
    map (\line -> quoteParser line) allLines   -- <== This is not an IO action
    --putStr contents  
    hClose handl