【发布时间】:2014-05-14 10:33:51
【问题描述】:
场景:我是一名初级 C# 开发人员,但最近(3 天)开始学习 Perl 的批处理文件。我需要解析一个文本文件,提取一些关键数据,然后将关键数据输出到一个新的文本文件。似乎总是如此,网上有很多关于如何“读取”文件、“写入”到文件、“逐行存储”到数组、“过滤”这个和那,yadda yadda,但没有讨论读取,过滤,写入的整个过程。尝试将网络上的示例拼接在一起是不好的,因为似乎没有一个可以作为连贯的代码一起工作。来自 C#,Perl 的语法结构令人困惑。我只是需要一些关于这个过程的建议。
我的目标是解析一个文本文件,按日期挑出与下面类似的所有行,并仅将第二个数字组的前 8 位和第三个数字组的 5 位输出到新的文本文件.
11122 20100223454345 ....random text..... [keyword that identifies all the
entries I need]... random text 0.0034543345
我知道正则表达式可能是最好的选择,并且大部分表达式都已编写,但它在 Perl 中不起作用!
问题:有人可以展示一个简单的(虚拟)示例,说明如何读取、过滤(使用虚拟正则表达式)文件,然后将(虚拟)结果输出到新文件吗?我不关心功能细节,我可以学习那些,我只需要 Perl 使用的语法结构。例如:
open(FH, '<', 'dummy1.txt')
open(NFH, '>', 'dummy2.txt')
@array; or $dumb;
while(<FH>)
{
filter each line [REGEX] and shove it into [@array or $dumb scalar]
}
print(join(',', @array)) to dummy2.txt
close FH;
close NFH;
注意:由于各种原因,我无法在此处粘贴我的源代码,抱歉。任何帮助表示赞赏。
更新:答案:
非常感谢所有对我的问题提供见解的人。在阅读了您的回复并进行了进一步的研究后,我了解到在 Perl 中有许多方法可以完成相同的任务(我不喜欢)。最后,这就是我解决问题的方法,而 IMO 对于那些有类似问题的人来说,这是最干净、最简洁的解决方案。再次感谢所有帮助。
#======================================================================
# 1. READ FILE: inputFile.txt
# 2. CREATE FILE: outputFile.txt
# 3. WRITE TO: outputFile.txt IF line matches REGEX constraints
# 4. CLOSE FILES: outputFile.txt & inputFile.txt
#==========================================================================
#1
$readFile = 'C:/.../.../inputFile.txt';
open(FH, '<', $readFile) or Error("Could not read file ($!)");
#2
$writeFile = 'C:/.../.../outputFile.txt';
open(NFH, '>', $writeFile) or Error("Cannot write to file ($!)");
#3
@lines = <FH>;
LINE: foreach $line (@lines)
{
if ($line =~ m/(201403\d\d).*KEYWORD.*time was (\d+\.\d+)/)
{
$date = $1;
$elapsedtime = $2;
print NFH "$date,$elapsedtime\n";
}
}
#4
close NFH;
close FH;
【问题讨论】: