【问题标题】:Using Perl to parse text from blocks使用 Perl 从块中解析文本
【发布时间】:2019-10-08 20:07:11
【问题描述】:

我有一个包含多个测试块的文件。对于每个测试块,我希望能够提取方括号中的内容、包含单词“area”的第一个实例的行以及方括号右侧的内容。一切都将是一个字符串。基本上我想要做的是将每个字符串存储到哈希中的一个变量中,这样我就可以将它打印到一个 3 列的 csv 文件中。

这是文件的样例:

学生-[K-6] 数学优异
/home/area/kinder/mathadvance.txt, 12
K-12 年级的学生在数学方面表现出色。
被安排到特殊的课后计划中。
见 /home/area/overall/performance.txt, 200

学生-[初级] 表现不佳
综合成绩较差的学生。
提供的暑期课程服务如
“/home/area/services/summer.txt”,212

学生-[K-6] 体育锻炼时间段
/home/area/pe/schedule.txt, 303
根据学生的年级分配体育课时隙。参考
/home/area/overall/classtimes.txt, 90

我想要一个看起来像这样的最终 csv 文件:

等级、主题、路径
K-6, 数学优异, /home/area/kinder/mathadvance.txt, 12
K-6,体育锻炼时间段,/home/area/pe/schedule.txt,303
初级,表现不佳,“/home/area/services/summer.txt”,212

因为它是一个 csv 文件,所以我知道它在导出到 excel 时也会在行号处分开,但我很好。
我首先将成绩类型放入一个数组中,因为我希望能够为不同的年级添加更多的字符串。

到目前为止,我的程序如下所示:

#!/usr/bin/perl
use strict;
use warnings;

my @grades = ("K-6", "Junior", "Community-College", "PreK");

我在想我需要执行某种系统 sed 命令来获取括号中的内容并将其存储到变量中。然后我将抓取该行括号右侧的所有内容并将其存储到一个变量中。然后我将 grep 查找包含“区域”的行以获取路径,并将其作为字符串存储到变量中,将它们放入哈希中,然后打印到 csv 中。我不确定我是否以正确的方式考虑这个问题。另外,我不知道如何为文件中的每个文本块执行此操作。我需要一个块一个,因为每个块都有自己对应的等级、主题和路径。

【问题讨论】:

  • 您想使用Perl Regexes。你的问题很好;抱歉,我现在没有时间为您编写一个可行的示例。我引用的链接应该为您指明正确的方向。

标签: perl


【解决方案1】:
perl -000 -ne '($grade, $topic) = /\[(.*)\] (.*)/;
               ($path) = m{(.*/area/.*)};
               print "$grade, $topic, $path\n"' -- file.txt
  • -000开启段落模式,-n不会逐行读取,而是逐段读取
  • /\[(.*)\] (.*)/ 匹配方括号和任何跟在它们后面的换行符。方括号的内部和以下文本使用括号捕获。
  • m{(.*/area/.*)} 捕获包含“区域”的行。它使用m{} 语法而不是//,因此我们不必反斜杠(避免所谓的“倾斜牙签综合症”)

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2013-08-21
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多