Skip to content

Instantly share code, notes, and snippets.

@kgadek
Created September 18, 2013 01:05
Show Gist options
  • Save kgadek/6603088 to your computer and use it in GitHub Desktop.
Save kgadek/6603088 to your computer and use it in GitHub Desktop.
I cannot into attoparsec
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
import qualified Data.Text.IO
import qualified Data.Attoparsec.Text as AT
import qualified Data.Attoparsec.Combinator as ATC
import Control.Monad
readValue :: AT.Parser T.Text
readValue = do
res <- ATC.manyTill AT.anyChar (AT.try $ AT.char ';')
return $ T.pack res
readValues :: AT.Parser [T.Text]
readValues = ATC.manyTill readValue (AT.try AT.endOfLine)
skipLine :: AT.Parser ()
skipLine = do
AT.takeTill AT.isEndOfLine
AT.takeWhile AT.isEndOfLine -- pomija też wszystkie następujące bezpośr. puste linie
return ()
parseHeaderData :: T.Text -> AT.Parser [T.Text]
parseHeaderData name = do
AT.string name
AT.takeWhile AT.isEndOfLine
res <- readValues
AT.takeWhile AT.isEndOfLine
return res
mbankCSVParser :: AT.Parser T.Text
mbankCSVParser = do
ATC.count 6 skipLine -- nagłówek
[klient] <- parseHeaderData "#Klient;"
skipLine -- śmieć
[okres_od, okres_do] <- parseHeaderData "#Za okres:;"
[rodzaj_rachunku] <- parseHeaderData "#Rodzaj rachunku;"
[waluta] <- parseHeaderData "#Waluta;"
[nr_rachunku] <- parseHeaderData "#Numer rachunku;"
[data_nast_kapitalizacji] <- parseHeaderData "#Data następnej kapitalizacji;"
[oprocentowanie_rachunku] <- parseHeaderData "#Oprocentowanie rachunku;"
[limit_kredytu] <- parseHeaderData "#Limit kredytu;"
[oprocentowanie_kredytu] <- parseHeaderData "#Oprocentowanie kredytu;"
[_, uznania_liczba, uznania_wartosc] <- parseHeaderData "#Podsumowanie obrotów na rachunku;#Liczba operacji;#Wartość operacji"
[_, obciazenia_liczba, obciazenia_wartosc] <- parseHeaderData ""
[_, lacznie_liczba, lacznie_wartosc] <- parseHeaderData ""
["#Saldo początkowe", saldo_poczatkowe] <- parseHeaderData ""
headers <- parseHeaderData ""
return nr_rachunku
main :: IO ()
main = do
file <- Data.Text.IO.readFile "ekonto.csv"
let res = AT.parseOnly mbankCSVParser file
--either putStrLn putStrLn res
either putStrLn Data.Text.IO.putStrLn res
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment