2014-06-08 2 views
2

분석하고자하는 일부 데이터를 처리하기 위해 하스켈을 사용하려고합니다. 이 데이터는 대부분 구조화되어 있지만 일관성이 없습니다. 날짜는 여러 곳에서 표현할 수 있지만 항상 같은 위치에 있어야합니다 (문서는 XML 임). 하스켈에서 여러 날짜 형식을 구문 분석

내가 지금까지 본 서로 다른 형식

은 다음과 같습니다

".. 목요일 6월 22일 1972"

"1971 2월 25일"

"1973 년 3 월 3 일"

"10 월 17 일 목요일 \ r \ n 1974."

"1976 년 3 월 5 일 금요일"

"4 월 25 일 \ r \ n 1977 년.

"화요일 1983년 12월 6일"

"10 5 월 1988"

"1988 년 10 월 20 일이"

난 정말 어디서부터 시작 모른다 - 내가 다룰 수있는 개별 형식, 그러나 나는 그들 모두를 다룰 줄 모르겠습니다. String -> Maybe Day와 같은 함수를 원합니다.

답변

1

첫 번째 문제는 한 번에 각 문제를 해결하고 그 파서 중 하나에 자신을 제한하십시오. 먼저이 파서에 대한 몇 가지 테스트를 작성하십시오.

하스켈에서 구문 분석하는 것은 다른 언어로 구문 분석하는 것과 상당히 다릅니다. 보통 정규 표현식이나 다른 방법을 사용합니다. haskell에는 파서 결합자를 제공하는 우수한 라이브러리가 있습니다. 내가 사용한 것들은 parsecattoparsec입니다.

  • 각각의 데이터 유형을 제작하거나 기존 time -package를 사용합니다.

  • 매월 파서 (Jan 또는 Feb ..)를 작성한 다음 결합하십시오. 그러나 MarchMay은 모두 같은 문자로 시작해야합니다. 간단한 조합 이상이 필요합니다. 동일은 January, JuneJuly

  • 다시 일부 1 (양극과 음극의 경우 모두) 간단한 파서에 대한 테스트
  • 매일의 파서를 작성 (또는 2 또는 3이 꽤 도움이된다 마찬가지입니다 나) n 번째
  • 다시 결합주의 - 당신이 Parser Day, Parser Month 및,658을 가져야한다 11, 12가 '1'
  • 이제

에 대한 파서를 쓰기로 모두 시작 손에그리고 어쩌면 Parser Weekday.

  • 당신이 거기에, 마지막 주에 나머지 자신에게

을 구현하기 위해 손에 충분한 유틸리티가 있어야 지금 Parser Day

  • 를 얻기 위해 자신을 제한 한 파서를 형성하는 파서를 결합 parsec/attoparsec에 대한 자습서가 많이 있습니다. 거기에 최소한의 불신자 검색 엔진 만 사용하십시오.

  • +1

    실습으로이 글을 쓰지 않는다면, 다른 누군가가 이미 이것을 구현하고 직업을 좀더 쉽게 만든다면 hackage.haskell.org를 추천 할 것입니다. – epsilonhalbe

    +0

    btw -이 정보가 충분하지 않은 경우 댓글을 남기십시오. 더 자세히 설명해 드리겠습니다. – epsilonhalbe

    +0

    이것은 운동이 아니므로 누군가 elses 라이브러리를 사용하고 싶습니다! hackage에 대한 Day Month 등의 사전 작성된 파서를 찾으시겠습니까? – oneway

    1

    구문 분석 날짜를 hackage 여러 라이브러리가 있습니다

    그런 다음 여러 가지 파서를 함께 연결할 수 있습니다.

    p1 :: String -> Maybe Day 
    

    는 다음과 같이 다음을 결합 :

    parseDate :: String -> Maybe Day 
        parseDate = p1 <||> p2 <||> p3 
    

    하면

    -- Chain operator: if p1 returns Nothing, then return p2 
        p1 <||> p2 = case p1 of 
            Nothing -> p2 
            Just r -> Just r 
    

    그래서 각 형식의 구문 분석 기능을 작성합니다 다음은 손으로 압연 "대안"연산자이다 당신은 Control.Applicative에서 무료로이 대체 연산자()를 얻은 적절한 파서를 작성합니다. 여기에 고객님의 파서 작성에 관한 tutorial이 있습니다.

    구두점을 제거하고 "rd"형식을 제외하여 원시 텍스트를 전처리하는 것이 좋습니다. 그러면 훨씬 강력하고 작성해야 할 구문 분석 함수의 수를 줄일 수 있습니다. 또한 더 나은 성능이 필요한 경우 Data.Text을 사용하는 것도 고려하십시오.