2014-08-31 2 views
0

CSV 파일의 첫 번째 행을 구문 분석하고 결과로 파서 목록을 가져오고 비참하게 실패합니다.CSV 헤더를 파서 목록으로 구문 분석

몇 가지 단순화 한 후에 작동해야한다고 생각되는 코드가 있지만 그럴 필요가 없으며 그 이유를 이해할 수 없습니다.

> Right ["field1"] 

뭔가를 얻을 것으로 예상, 나는 test 전화

{-# 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>" 

대신 나는 내가 뭘 잘못

> Left "Failed reading: takeWith" 

얻을 : 여기

는 무엇입니까? 내 타이틀 라인이 확실히 endOfLine에 의해 사로 잡았됩니다 \n 또는 \r\n을해야합니다, 내 예를 들어 입력 그것에 \n을 가지고 있지 않았다

+0

에 대한 문서입니다'endOfLine'는 말한다 : " 'N \'경기 중 하나의 개행 문자 또는 개행 문자 다음에 캐리지 리턴"\ 연구 \ n "." . 그러나 입력에 "\ n"또는 "\ r \ n"이 없으므로 파서가 실패합니다. – bennofs

+0

@bennofs 감사합니다. 당신 말이 맞습니다. 그것은 작동하고, 나의 질문은 장님의 문제입니다. –

+0

당신의 취향에 따라 Haskell을위한 몇 가지 좋은 CSV 라이브러리가 있다는 것을주의하십시오. Real World Haskell은 parsec을 사용하여 자신 만의 롤백을 원한다면 영감을 얻기 위해 찾을 수있는 CSV 파서를 작성하는 섹션을 가지고 있습니다. – AndrewC

답변

0

문제는 잘못된 입력입니다.

작업 버전이

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