我从巨型文本文件中提取数据,其中我感兴趣的部分看起来像
and
各部分/子部分随机分散在整个文本文件中,并具有可变数量的xy对。现在,我已阅读全文并捕获每个文本并将其添加到数据框中:
...
section:NumberOfSurvivorsPerVault
subsection:1958
xy:1_1034
xy:2_2334
subsection:1959
xy:1_1334
xy:2_2874
xy:7_12
...
section:MeanCapsPerGhoul
subsection:1962
xy:1_234
xy:2_121
....
这可以正常工作,但我认为由于两个正则表达式,它至少分配了两倍的内存,而@time显示80%的运行是gc。有没有办法可以在不制作中间副本的情况下完成这项工作? (据我所知,单个正则表达式无法做到这一点)。
答案 0 :(得分:1)
这完全取决于您需要在文本文件的其余部分验证。 例如,如果您不需要语法验证,就像您确定文本文件具有正确的section-subsection-item结构一样,您可以使用此RegEx:
(?:\G|(?:\G|^section:(.*)[\r\n]+)subsection:(\d*)[\r\n]+)xy:(\d*_.*+[\r\n]+)
迭代每个 xy对。
示例:
for m = eachmatch(r"(?:\G|(?:\G|^section:(.*)[\r\n]+)subsection:(\d*)[\r\n]+)xy:(\d*_.*+[\r\n]+)"m, full)
if m.captures[2] != nothing
sub = m.captures[2]
if m.captures[1] != nothing
sec = m.captures[1]
end
end
item = m.captures[3]
print("SECTION: ", sec, " -- SUBSECTION: ", sub, " -- ITEM: ", item)
end
*请原谅我,这是我第一次尝试在Julia编码。
打印:
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1958 -- ITEM: 1_1034
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1958 -- ITEM: 2_2334
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 1_1334
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 2_2874
SECTION: NumberOfSurvivorsPerVault -- SUBSECTION: 1959 -- ITEM: 7_12
SECTION: MeanCapsPerGhoul -- SUBSECTION: 1962 -- ITEM: 1_234
SECTION: MeanCapsPerGhoul -- SUBSECTION: 1962 -- ITEM: 2_121
此表达式使用\G
在最后一场比赛结束时进行匹配。所以它会尝试按此顺序匹配:
如果有上一场比赛,请尝试匹配m.captures[3]
中锚定到最后一场比赛结尾的 xy对,让第一和第二个捕捉组无法设置。< / p>
如果(1)不匹配,请尝试匹配m.captures[2]
和m.captures[3]
中的子部分和 xy对 },再次锚定到最后一场比赛的结束,让第一个捕捉组未设置。
尝试使用部分,子部分和 xy对
此示例适用于您的主题文本,仅作为工作示例的起点,具体取决于文本文件的实际结构。考虑到如果缺少子节,它将会失败。