我的数据包含来自计算机程序的以下文本输出:
<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
分隔。我认为这些可能会被||
捕获,但我不确定该指令是如何工作的以及它是否可以嵌套。如果两者都没有指定,那么将没有括号(与方形圆顶一样)。
为了向自己和其他人提供更多示例来学习这个强大的工具,我想我可能会在这里发布这个问题。
答案 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)