Haskell 如何使用Attoparsec解析yahoo历史csv
我是haskell的初学者,如何用ATOPASSEC解析成开放数组、高位数组等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
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