美文网首页Raku Programming Language
Perl 6 Grammar 之分割结构化文本

Perl 6 Grammar 之分割结构化文本

作者: 焉知非鱼 | 来源:发表于2016-11-01 01:05 被阅读28次

如何使用 Grammar 分割一个有规律的文本文件? 首先这个文本有规律, 但是却是多行的。
我想将这样的文档分为独立的. 比如下面这个例子, 我想将他们分成3个独立的文本, 每个文本包含: [时间] Title 以及下面的 content lines. 实际的文件会有上千个, 最终输出的文本的名字是按照括号里面的时间来。

sample.txt

[28/04/2015 12:32] Title1

content line 1
content line 2
content line 3
content line 4
content line 5

balabala
balabala

[28/04/2015 12:16] Title2

content line 6
balabala
content line 7

[27/04/2015 17:30] ​Title3

content line 8
content line 9
content line 10

下面是解析:

#use Grammar::Tracer;
#use Grammar::Debugger;

grammar StructedText {
    token TOP { ^ <entry>+ $ }
    token entry {
        <head> \s*   # 每一项有一个标题
        <line>+ \s*  # 每个标题下面有很多行
    }
    
    token head     { '[' <datetime> ']' \s+ <title> }
    token datetime {  <filedate> \s+  <filetime> }
    token filedate { [\d+]+ % '/' }
    token filetime { [\d+]+ % ':' }
    token title    { \N+          }
    token line  {
        [
            <!head>       # 前面不是 head 标题
            .             # 点号匹配换行符
        ]+
    }
}
# Method 'ast' not found for invocant of class 'Str'
# make ~$<filetime>.subst(':', '-', :g).ast;

class StructedText::Actions {
    method line($/)  { $/.make: ~$/                            }
    method title($/) { $/.make: ~$/}
    method datetime($/) { $/.make: ~$/.subst(rx/<[:/]>/, '-', :g) }
    method head($/)  { $/.make: ~$<datetime>.ast }
    method entry($/) { make $<head>.ast => $<line>».made;      }
    method TOP($/)   { $/.make: $<entry>».ast;                 }    
}
my $actions = StructedText::Actions.new;
my $parsed = StructedText.parsefile('sample.txt', :$actions).made;
if $parsed {
    for @$parsed -> $e {
        say ~$e.key;
    }
    
}

只打印时间:

28-04-2015 12-32 
28-04-2015 12-16
27-04-2015 17-30

下面是完整的分割代码:

grammar StructedText {
    token TOP { ^ <entry>+ $ }
    token entry {
        <head> \s*   # 每一项有一个标题
        <line>+ \s*  # 每个标题下面有很多行
    }
    
    token head     { '[' <datetime> ']' \s+ <title> }
    token datetime {  <filedate> \s+  <filetime>    }
    token filedate { [\d+]+ % '/' }
    token filetime { [\d+]+ % ':' }
    token title    { \N+          }
    token line  {
        [
            <!head>       # 前面不是 head 标题
            .             # 点号匹配换行符
        ]+
    }
}

class StructedText::Actions {
    method line    ($/) { $/.make: ~$/                            }
    method filedate($/) { $/.make: ~$/.subst(rx/<[:/]>/, '-', :g) }
    method head    ($/) { $/.make: ~$/.subst(rx/<[:/]>/, '-', :g) }
    method entry   ($/) { make $<head>.ast => $<line>».made;      }
    method TOP     ($/) { $/.make: $<entry>».ast;                 }    
}

my $actions = StructedText::Actions.new;
my $parsed = StructedText.parsefile('sample.txt', :$actions).made;

if $parsed {
    for @$parsed -> $e {
        my $filename = ~$e.key.match(/'[' <( <-[\[\]]>+ )> ']'/)  ~ ".txt";
        my $fh = open $filename, :w; 
        $fh.say: ~$e.key;
        for $e.value -> $v {
            $fh.say: $v;
        }
        $fh.close;
        say "生成文件 $filename ";       
    }
    
}

<()> 是只捕获整个匹配中的一部分。这里即只捕获时间, 不包括 [] 字符。match 方法返回匹配到的对象。

相关文章

  • Perl 6 Grammar 之分割结构化文本

    如何使用 Grammar 分割一个有规律的文本文件? 首先这个文本有规律, 但是却是多行的。我想将这样的文档分为独...

  • Perl 6 博文收集

    本文意在收集 Perl 6 方面的博文, 如有侵权请告知删除。 Chinese Perl 6 的 Grammar ...

  • Perl 6 Grammar 指南

    Perl 6 Doc 官网新收录了一篇 Grammar 指南

  • Perl 6 at a glance - Grammar 读书笔

    感谢和颜兄分享了 Perl 6 at a glance 一书。 这段是说 rule 和 rule 的定义之间是可以...

  • Perl 分割文本文件

    test1123123test2...test10123123 分割代码: gawk 方法

  • 模式匹配和 Unpacking

    模式匹配和 Unpacking 当在 Perl 6 中讨论模式匹配时,人们通常会考虑正则表达式或 Grammar。...

  • Perl 6 中的梳子!

    Perl 6 中的梳子! 在 Perl 5 中, 我很感激有这样两个便利的结构: 你拿出一小段可以预见的文本,并...

  • 简介

    perl擅长处理文本,其程序即源代码。perl程序也只是一个纯文本文件。一个最简单的perl程序 在执行前需要改一...

  • Greedy NLP Learning Notes(六)信息抽取

    1. 目录 从非结构化文本中进行信息抽取从非结构化文本中进行信息抽取非结构化数据:图像、文本、视频、声音结构化数据...

  • Perl 6 .rotor - 列表操作之王

    Perl 6 .rotor - The King of List Manipulation 对于 Perl 6 程...

网友评论

    本文标题:Perl 6 Grammar 之分割结构化文本

    本文链接:https://www.haomeiwen.com/subject/xotmuttx.html