0

我想解析 CSV 文件的第一行并得到解析器列表,结果惨遭失败。

经过一些简化后,我得到了我认为应该可以工作的代码,但它没有,我不明白为什么。

这里是:

{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Data.Attoparsec.Text
import Control.Applicative

doTestSep :: [String] -> Parser [String]
doTestSep t = do
      (endOfLine >> return t)
  <|> (char ';'  *> doTestParse t)

doTestParse :: [String] -> Parser [String]
doTestParse t = do
      (string "<FIELD1>" *> doTestSep ("field1" : t))
  <|> (string "<FIELD2>" *> doTestSep ("field2" : t))

test = parseOnly (doTestParse []) "<FIELD1>"

我打电话test,期待得到类似的东西

> Right ["field1"]

但相反我得到

> Left "Failed reading: takeWith"

我究竟做错了什么?

4

1 回答 1

0

一个问题是输入错误:我的标题行肯定会有\nor \r\n,它会被 捕获endOfLine,而我的示例输入中没有\n

工作版本是

test = parseOnly (doTestParse []) "<FIELD1>\n"
于 2014-08-31T17:18:08.180 回答