如何使用txr查询捕获此计算机输出?

时间:2017-01-03 21:28:11

标签: text-parsing txr

我的数据包含来自计算机程序的以下文本输出:

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg height="300" width="500"></svg>

我想写一个txr查询来捕获这些数据并生成以下CSV表:

[Coordination geometry type : Single neighbor (IUCr: [1l])

   - coordination number : 1
 ------------------------------------------------------------,
 Coordination geometry type : Linear (IUPAC: L-2 || IUCr: [2l])

   - coordination number : 2
 ------------------------------------------------------------,
 Coordination geometry type : Anticuboctahedron (IUCr: [12aco])

   - coordination number : 12
 ------------------------------------------------------------,
 Coordination geometry type : Square cupola

   - coordination number : 12
 ------------------------------------------------------------,
 Coordination geometry type : Hexagonal prism (IUPAC: HPR-12 || IUCr: [12p])

   - coordination number : 12
 ------------------------------------------------------------,
 Coordination geometry type : Hexagonal antiprism (IUPAC: HAPR-12)

   - coordination number : 12
 ------------------------------------------------------------,
 Coordination geometry type : Square-face capped hexagonal prism

   - coordination number : 13
 ------------------------------------,------------------------,
 Coordination geometry type : Unknown environment

   - coordination number : None
 ------------------------------------------------------------,
 Coordination geometry type : Unclear environment

   - coordination number : None
 ------------------------------------------------------------]

我认为查询应该是这样的:

cnum,geom,IUPAC,IUCr
1,single neighbor,,[1l]
2,linear,L-2,
2,linear,,[2l]
12,anticuboctahedron,,[12aco]
12,square cupola,,
12,hexagonal prism,HPR-12,
12,hexagonal prism,,[12p]
12,hexagonal antiprism,HAPR-12,
13,square-face capped hexagonal prism,,
,unknown environment,,
,unclear environment,,

但是我遇到了一些语法错误和混乱。具体做法是:

由于此输出显示为括号列表,因此我不清楚如何捕获第一行。我想也许正则表达式可以解决这个问题,但这看起来效率不高。此外,我不清楚这是否是正确的语法。 @(collect :vars (cnum geom IUPAC IUCr)) @/ |\[/Coordination geometry type : @geom @(maybe)(IUPAC: @IUPAC@(maybe) || IUCr: @IUCr(@end))@(end) - coordination number : @cnum ------------------------------------------------------------, @(last) ------------------------------------------------------------] @(end) @(output) cnum,geom,IUPAC,IUCr @(repeat) @cnum,@(do (downcase-str @geom)),@IUPAC,@IUCr @(end) @(end) 应该被转义吗?我可以使用[指令中提到的@(first)来处理这种情况吗?

@(repeat)IUPAC是括号中存在的可选变量,由IUCr分隔。我认为这些可能会被||捕获,但我不确定该指令是如何工作的以及它是否可以嵌套。如果两者都没有指定,那么将没有括号(与方形圆顶一样)。

为了向自己和其他人提供更多示例来学习这个强大的工具,我想我可能会在这里发布这个问题。

1 个答案:

答案 0 :(得分:1)

试试这个:

@(collect :vars (cnum geom (IUPAC "") (IUCr "")))
@  (cases)
@/[ \[]/Coordination geometry type : @geom (IUPAC: @IUPAC || IUCr: @IUCr)
@  (or)
@/[ \[]/Coordination geometry type : @geom (IUPAC: @IUPAC)
@  (or)
@/[ \[]/Coordination geometry type : @geom (IUCr: @IUCr)
@  (or)
@/[ \[]/Coordination geometry type : @geom
@  (end)

   - coordination number : @cnum
@(last)
 ------------------------------------------------------------]
@(end)
@(output)
cnum,geom,IUPAC,IUCr
@  (repeat)
@cnum,@{geom :filter :downcase},@IUPAC,@IUCr
@  (end)
@(end)

原始代码中的语法错误是由(@end)错字引起的;解决这个问题并txr接受它。不幸的是,它没有用。

第一个区别是在collect :vars中,我们给出了可选变量的默认值。如果没有这些,在没有发生这些情况时就不能将它们绑定在一起会导致失败。

是的,maybe确实嵌套,我们可以这样解决。但是,以一些重复为代价,面向行的cases以易于阅读的方式处理案例。

请注意案件的顺序很重要。

我们不匹配...----,分隔线。这样做只会阻止我们匹配以...---]结尾的最后一条记录。请注意,last子句指定整个collect正文的替代模式,而不仅仅是最后一行的替代模式。我们保留它以提供终止测试。根本没有必要。如果数据后跟其他可能增加误报匹配的材料,或者浪费大量时间,我们就需要进行此测试。

output中,我们无法使用do;没有这样的指示。 (do实际上被解释为Lisp。我使用输出过滤器来对几何体进行包装。如果使用了@(downcase-str geom),那么:vars (geom)中需要repeat,因为geom只会出现在Lisp表达式中,而repeat则相当天真,不会为需要自动迭代的变量分析Lisp代码。

这是一种减少案例重复的方法,使用模式函数来保持整洁:

@(define formula (x y))@\
  @(cases) (IUPAC: @x || IUCr: @y)@\
  @(or) (IUPAC: @x)@\
  @(or) (IUCr: @y)@\
  @(or)@(eol)@\
  @(end)@\
@(end)
@(collect :vars (cnum geom (IUPAC "") (IUCr "")))
@/[ \[]/Coordination geometry type : @geom@(formula IUPAC IUCr)

   - coordination number : @cnum
@(last)
 ------------------------------------------------------------]
@(end)
@(output)
cnum,geom,IUPAC,IUCr
@  (repeat)
@cnum,@{geom :filter :downcase},@IUPAC,@IUCr
@  (end)
@(end)