我正在尝试找出在Haskell中解析特定文本文件的“正确”方法。
在F#中,我循环遍历每一行,使用正则表达式测试它是否是我想要解析的行,如果是,则使用正则表达式解析它。否则,我会忽略这行。
该文件是一个可打印的报告,每个页面都有标题。每条记录都是一行,每个字段由两个或更多空格分隔。以下是一个示例:
我首先构建了解析器来测试每一行是否为记录。如果是记录,我会使用自己编写的子字符串函数根据字符位置拆分该行。这个方法表现良好。
然后我发现我的Haskell安装中确实有一个正则表达式库,所以我决定尝试像在F#中那样使用正则表达式。但是,这个库不接受完全有效的正则表达式,所以失败了。
然后我想,Parsec呢?但是,对于使用它的学习曲线随着我越来越深入而变得越来越陡峭,我开始怀疑它是解析此报告这样简单任务的正确工具吗?
因此,我想问一些Haskell专家:您如何解析这种类型的报告?我不是要求代码,尽管如果您有一些代码,我很乐意看到它。我真的在询问技术或技术方面。
谢谢!
附注:输出只是一个带有文件顶部字段名称行的冒号分隔文件,后跟仅记录,可以导入Excel供最终用户使用。
编辑:
非常感谢大家的精彩评论和答案! 因为我最初没有表明:示例的前14行针对(打印)输出的每一页都会重复出现,每页的记录数量从零到整页(看起来像45条记录)不等。我很抱歉之前没有表明清楚,因为这可能会影响已经提供的一些答案。
我的Haskell系统目前仅限于Parsec(它没有attoparsec)和Text.Regex.Base以及Text.Regex.Posix。我将尝试安装attoparsec和/或其他正则表达式库。但是在此期间,您已经说服我继续学习Parsec。感谢您提供的非常有用的代码示例!
在F#中,我循环遍历每一行,使用正则表达式测试它是否是我想要解析的行,如果是,则使用正则表达式解析它。否则,我会忽略这行。
该文件是一个可打印的报告,每个页面都有标题。每条记录都是一行,每个字段由两个或更多空格分隔。以下是一个示例:
MY COMPANY'S NAME
PROGRAM LISTING
STATE: OK PRODUCT: ProductName
(DESCRIPTION OF REPORT)
DATE: 11/03/2013
This is the first line of a a two-line description of the contents of this report. The description, as noted,
spans two lines. This is more text. I'm running out of things to write. Blah.
DIVISION CODE: 3 XYZ CODE: FAA3 AGENT CODE: 0007 PAGE NO: 1
AGENT TARGET NAME ST UD TARGET# XYZ# X-DATE YEAR CO ENCODING
----- ------------------------------ -- -- ------- ---- ---------- ---- ---------- ----------
0007 SMITH, JOHN 43 3 1234567 001 12/06/2013 2004 ABC SIZE XL
0007 SMITH, JANE 43 3 2345678 001 12/07/2013 2005 ACME YELLOW
0007 DOE, JOHN 43 3 3456789 004 12/09/2013 2008 MICROSOFT GREEN
0007 DOE, JANE 43 3 4567890 002 12/09/2013 2007 MICROSOFT BLUE
0007 BORGES, JORGE LUIS 43 3 5678901 001 12/09/2013 2008 DUFEMSCHM Y1500
0007 DEWEY, JOHN & 43 3 6789012 003 12/11/2013 2013 ERTZEVILI X1500
0007 NIETZSCHE, FRIEDRICH 43 3 7890123 004 12/11/2013 2006 NCORPORAT X7
我首先构建了解析器来测试每一行是否为记录。如果是记录,我会使用自己编写的子字符串函数根据字符位置拆分该行。这个方法表现良好。
然后我发现我的Haskell安装中确实有一个正则表达式库,所以我决定尝试像在F#中那样使用正则表达式。但是,这个库不接受完全有效的正则表达式,所以失败了。
然后我想,Parsec呢?但是,对于使用它的学习曲线随着我越来越深入而变得越来越陡峭,我开始怀疑它是解析此报告这样简单任务的正确工具吗?
因此,我想问一些Haskell专家:您如何解析这种类型的报告?我不是要求代码,尽管如果您有一些代码,我很乐意看到它。我真的在询问技术或技术方面。
谢谢!
附注:输出只是一个带有文件顶部字段名称行的冒号分隔文件,后跟仅记录,可以导入Excel供最终用户使用。
编辑:
非常感谢大家的精彩评论和答案! 因为我最初没有表明:示例的前14行针对(打印)输出的每一页都会重复出现,每页的记录数量从零到整页(看起来像45条记录)不等。我很抱歉之前没有表明清楚,因为这可能会影响已经提供的一些答案。
我的Haskell系统目前仅限于Parsec(它没有attoparsec)和Text.Regex.Base以及Text.Regex.Posix。我将尝试安装attoparsec和/或其他正则表达式库。但是在此期间,您已经说服我继续学习Parsec。感谢您提供的非常有用的代码示例!
Text.Regex
和Text.Regex.PCRE
两种吗?Text.Regex
是Text.Regex.Posix
的影子包,可能不支持您习惯使用的功能。PCRE 是类似 Perl 的正则表达式,并具有更广泛的功能提供。 - Elliot Robinson