《Clojure数据分析秘笈》——2.11节解析自定义数据格式
本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第2章,第2.11节解析自定义数据格式,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
2.11 解析自定义数据格式
如果你处理的数据足够长,你最终会遇到没有任何库能处理的,你需要编写自己的解析器。对于一些格式而言正则表达式就足够了,但是如果你需要保持输入中的句法结构平衡或对输出做一些复杂的工作,最好创建一个自定义的解析器。对于数据量大的输入自定义解析器会比正则表达式处理速度慢,但有时它们仍是最好的选项。
Clojure语言(以及大多数函数式编程语言)适合解析,并且多数包含可以极度简化编写解析器的解析器连接库。
在本方法中,作为需要解析的数据格式的例子,处理一些FASTA数据(http://en.wikipedia.org/wiki/FASTA_format)。FASTA是一种在生物信息学中交换核甘酸和缩氨酸序列中使用的数据格式。当然已有这类数据的解析器,但简易性和自定义的数据格式使其成为本方法中合适的样例。
FASTA数据的第一行以一个>符号开头,后跟一个唯一的标识符。这一行中通常包含样本的其他描述信息、它来自的数据库以及其他信息。关于FASTA数据的更详细的解释在http://www.ncbi.nlm.nih.gov/BLAST/blastcgihelp.shtml中。一条FASTA记录如下:
2.11.3 实现原理
从最抽象的层次上来说,解析器是函数。它们以字符串为输入返回一种数据结构。更复杂一点,通过组合较简单的元素构建高级的解析器。
<|函数是一个很好的例子。它本身并不解析任何内容。然而,它通过以一种有效的方式将另外两个解析器结合起来:它解析两部分内容并将第二部分的结果舍弃。
acid-code函数是从基本部件构建解析器的例子。它匹配集合中的任意字符。
接着acid-code-line结合acid-code解析器。它匹配一个或多个acid-code字符,有的包含换行符。它使用<|连接器丢弃新的一行并返回acid-codes的序列。
整个解析器由简单的部分组成复杂的结构。尽管这是一个非常基础的解析器,但是可以按这种方式创建更为复杂的解析器,利用Clojure的强大功能使代码具有高可读性和可维护性。