Парсек: Пропустить первую строку

Я написал код парсека, который отлично работает для того, что я хочу. Он анализирует, как и ожидалось, следующий файл:

4,5
6,7

Соответствующий код выглядит так:

import Text.ParserCombinators.Parsec
import Control.Applicative hiding ((<|>))
import Control.Monad

data Test = Test Integer Integer deriving Show

integer :: Parser Integer
integer = rd <$> many1 digit
    where rd = read :: String -> Integer

testParser :: Parser Test
testParser = do
  a <- integer
  char ','
  b <- integer
  return $ Test a b

testParserFile = endBy testParser eol

eol :: Parser Char
eol = char '\n'

main = do
  a <- parseFromFile testParserFile "./jack.txt"
  print a

Но мои настоящие файлы такие:

col 1,col 2
4,5
6,7

Есть ли способ сделать вышеуказанный парсер, просто пропустив первую строку?


person Sibi    schedule 27.03.2014    source источник
comment
Да, съешь many не-\n, потом \n, потом иди своей дорогой   -  person luqui    schedule 27.03.2014


Ответы (1)


testParserFile = manyTill anyChar newline *> endBy testParser eol

manyTill p end применяет p до тех пор, пока end не завершится успешно. *> последовательно выполняет два действия и отбрасывает первое значение.

Примечание: если ваш реальный файл не содержит новой строки в конце, вам нужно использовать sepEndBy вместо endBy. Однако это может быть результатом парсера Markdown в StackOverflow.

person Zeta    schedule 27.03.2014