嗯,也许我之前没有完全描述我的问题。对不起大家!以下是真正的问题:
我有一个包含专利数据的txt文件,例如:
1/1523 DWPI
AP-JP29446999A 19991015
PN-JP2000188399 A 20000704 DW200044 JP4568930B2 B2 20101027 DW201071
AN-2000495116
PA-(NPDE)DENSO CORP
PR-JP1998000295406 19981016
MC-U11-C18A3,U12-D02A
OPD-1998.10.16
ICAI-H01L29 / 12,H01L29 / 78,H01L21 / 265,H01L21 / 336
TI-平面型金属氧化物半导体场效应晶体管
AB-<-为了简单起见,取消了内容->
CPY-NPDE
FN-JP2000188399
有1523个格式相似的项目。我想分析专利数据,因此我必须解析数据。我已经为每个字段定义了数据类型,例如:
数据AP = AP字符串日期字符串
data PN = PN String Day String
data AN = AN String
data PD = PD day
.... -- many other data types are not shown just for simplicity.
现在我已经用megaparsec
为每个字段编写了解析器,例如apField
,pnField
,anField
等。
但是,并非每个记录都有相同的字段,例如,第二项可能仅包含AP,PN,PA,PR,OPD,TI,AB,CPY和FN的字段,而缺少AN,MC和ICAI 。此外,某人可能对不同领域感兴趣,并且 他只导出仅包含带有AP,PN,PA,OPD和CPY字段的记录的txt文件。
现在,我想编写一个通用代码,该代码可以使用人们感兴趣的字段来解析记录,并将解析结果写入SQLite
数据库中。
例如,如果要解析具有AP,PN,PA,OPD和CPY字段的记录,则可以根据输入构建记录解析器,例如toParser "ap,pn,pa,opd,cpy"
或toParser "ap,pa,cpy"
,我已经知道了。解析结果应分别为Record AP PN PA OPD CPY
或Record AP PA CPY
。然后,我想将解析结果写入数据库。由于数据中的每个记录都对应于Record
数据类型,并且要解析的记录可能不同,因此我必须根据用户的输入构造具有不同字段的Record
数据类型。这是我遇到的问题。
我可以通过将所有字段数据类型定义为data Field = Field [String]
并将记录定义为data Record = Record [Field]
来解决此问题。但是,我希望对数据类型进行更多控制,例如将日期设置为Day
,将ID号设置为Int
类型。
如果根据输入来构造具有不同字段的Record
数据类型是不可能的,那么也许有其他方法可以解决我的问题。我感谢任何建议!很抱歉,我对问题的描述太长,以前对我的问题的描述也模棱两可!
答案 0 :(得分:1)
好吧,如果我的问题正确,不,您不能编写一个函数,该函数根据输入返回不同的数据类型。但是, 可以做的是编写一个函数,该函数返回一个数据类型,该数据类型可以根据输入以不同的方式构造。例如:
data PatentRecord = PN String Day String
| AN String
| PD day
因此,现在您可以编写一个函数parseRecord :: String -> Maybe PatentRecord
,例如,该函数解析您的输入,并根据匹配的内容返回使用PatentRecord
构造函数或{{1}构建的PN
}构造函数等
PS:实施提示:在解析错误时,请使用AN
而不是Either SomeErrorType
来提供更丰富的信息;-)