2014-08-31 47 views
0

我想解析CSV文件的第一行,並得到解析器列表,結果失敗。將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" 

我在做什麼錯?

+0

對於文檔'endOfLine'說:「比賽一個單一的換行符‘\ n’或回車跟一個換行符‘\ r \ n’。」 。但是,您的輸入不包含「\ n」或「\ r \ n」,以便解析器將失敗。 – bennofs 2014-08-31 10:33:36

+0

@bennofs謝謝你,你是對的。它有效,我的問題是一個盲人問題。 – 2014-08-31 10:44:34

+0

請注意,根據您的喜好,Haskell有幾個優秀的CSV庫,而Real World Haskell有一節介紹如何使用parsec編寫一個CSV解析器,如果您想要自己製作一個CSV解析器,您可以尋找靈感。 – AndrewC 2014-08-31 17:10:18

回答

0

的一個問題是輸入錯誤:我的標題行肯定會有\n\r\n,將由endOfLine逮住,我的例子並沒有發揮它\n

工作版本是

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