Haskell 秒差距 EOF
Haskell Parsec EOF
我有一个包含以下许多数据格式的文件:
Dan Clark’s Profile Photo
Member Name
Dan Clark 2nd degree connection 2nd
Member Occupation
Founder and Headmaster at Some Company, LLC
Nina blalba’s Profile Photo
Member Name
Nina blabla 2nd degree connection 2nd
Member Occupation
Consultant - GAmes executive search
我的解析器解析上面的文件:
module Main where
import Control.Applicative
import Control.Monad
import Text.ParserCombinators.Parsec hiding (many, (<|>))
data Contact = Contact {
name :: String,
occupation :: String,
company :: String
} deriving Show
matchContact :: Parser Contact
matchContact = do
name <- many anyChar
char '\''
string "s Profile Photo"
char '\n'
string "Member Name"
char '\n'
string name
many anyChar
char '\n'
string "Member Occupation"
char '\n'
job <- many anyChar
try $ string " at "
company <- many anyChar
try (char '\n')
return $ Contact name job company
main = do
c <- parseFromFile (many matchContact <* eof) "contacts.txt"
print c
数据不规则等问题较多。但是最急的是我总是在输入文件的最后一行运行进入错误:
Left "contacts.txt" (line 8670, column 12):
unexpected end of input
expecting "'"
如何解决这个问题?
您尝试 many anyChar
的第一个实例,解析器将愉快地将 文件的所有其余部分 解析为字符串 name
,因为后面的所有内容明确满足 any character 的标准(包括换行符)。这显然不是你想要的。
使用 manyTill
,或限制允许字符的选择,以便 name
将在适当的位置结束。
我有一个包含以下许多数据格式的文件:
Dan Clark’s Profile Photo
Member Name
Dan Clark 2nd degree connection 2nd
Member Occupation
Founder and Headmaster at Some Company, LLC
Nina blalba’s Profile Photo
Member Name
Nina blabla 2nd degree connection 2nd
Member Occupation
Consultant - GAmes executive search
我的解析器解析上面的文件:
module Main where
import Control.Applicative
import Control.Monad
import Text.ParserCombinators.Parsec hiding (many, (<|>))
data Contact = Contact {
name :: String,
occupation :: String,
company :: String
} deriving Show
matchContact :: Parser Contact
matchContact = do
name <- many anyChar
char '\''
string "s Profile Photo"
char '\n'
string "Member Name"
char '\n'
string name
many anyChar
char '\n'
string "Member Occupation"
char '\n'
job <- many anyChar
try $ string " at "
company <- many anyChar
try (char '\n')
return $ Contact name job company
main = do
c <- parseFromFile (many matchContact <* eof) "contacts.txt"
print c
数据不规则等问题较多。但是最急的是我总是在输入文件的最后一行运行进入错误:
Left "contacts.txt" (line 8670, column 12):
unexpected end of input
expecting "'"
如何解决这个问题?
您尝试 many anyChar
的第一个实例,解析器将愉快地将 文件的所有其余部分 解析为字符串 name
,因为后面的所有内容明确满足 any character 的标准(包括换行符)。这显然不是你想要的。
使用 manyTill
,或限制允许字符的选择,以便 name
将在适当的位置结束。