2010-05-13 22 views
1

我必须使用的文件是LDAP提取的结果,但我最终需要将信息格式化为电子表格可以使用的内容。从Perl列表中抽取特定信息

因此,数据如下:

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
displayName: John Doe 
name: ##userName 

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
displayName: Jane Doe Jr 
name: ##userName 

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData 
displayName: Ted Doe 
name: ##userName 

,我需要导出到的格式是:

firstName lastName userName 
firstName lastName userName 
firstName lastName userName 

当空间是标签这样我就可以再祁门功夫该文件为数据库。我有经验在VBScript中这样做,但我试图切换到使用Perl进行尽可能多的服务器管理。

我不知道关于语法的我想要的东西基本上是

while not endoffile{ 
detect "displayName: " & $firstName & " " & $lastName 
detect "name: ##" & $userName 

write $firstName tab $lastName tab $userName to file 
} 

此外,如果有人可以点我特别对Perl使用文本分析语法的资源,我会很感激。我遇到的大部分资源都不是很有帮助。

此外,某些用户名是数字。前两个数字仍然需要修剪,但userName的长度总是6个字符(如果有帮助的话)。

+2

值得一提的是,从单个字符串中解析出姓和名的字段并不重要。考虑一下“萨拉米歇尔盖拉”和“法拉福西特少校”的情况。一个正确的解析器(有可能)会知道解析这些名字的正确方法是“Sarah Michelle”,“Gellar”和“Farah”,“Fawcett Majors”。你将如何处理这些边缘情况取决于你,但你应该确保有一个指定的行为。否则,**罗伯特德尼罗**和他的朋友将打破你的软件。 – daotoad 2010-05-14 14:51:56

回答

3

像这样的东西应该做的伎俩 - 从标准输入和输出读到stdout,这样你就可以正常使用UNIX管道使用的文件:

#!/usr/bin/perl 

use strict; 
use warnings; 
use String::Util 'trim'; 

# set "line ending" to \n\n, to allow slurping by paragraphs: 
local $/ = "\n\n"; 

while (my $line = <>) 
{ 
    chomp $line; 

    my ($displayName) = ($line =~ /^displayName: (.+)$/m); 
    my ($name) = ($line =~ /^name: ##(.+)$/m); 
    trim $displayName; 
    trim $name; 

    my ($firstName, $lastName) = ($displayName =~ /^([^ ]+) (.+)$/); 

    print "$firstName\t$lastName\t$name\n"; 
} 

我这个使用你下面给样本输入测试作为test.pl < input.txt并得到了输出:

 
John Doe  userName 
Jane Doe  userName 
Ted  Doe  userName 

您可以了解下$ /段模式啜在perldoc perlvar,或在这太问题(链接需要)。在匹配运算符上使用m标志启用多行匹配 - 请参阅perldoc perlre

+0

脚注:我一直无法找到段落模式的SO引用,尽管我知道过去曾多次讨论过$ /'。如果有人发现这个链接,请添加评论或编辑它的问题 - 谢谢! – Ether 2010-05-13 22:08:55

+0

这里有一个问题处理段落分析:http://stackoverflow.com/questions/1809469/how-do-i-read-paragraphs-at-a-time-with-perl – FMc 2010-05-13 23:51:14

+0

@FM:那一个讨论设置' local $/= undef;' - 但我确定后面有个问题,讨论将它设置为'“\ n \ n”'以便一次读取段落... – Ether 2010-05-14 00:09:55

0

这是我的解决方案。

use strict; 
use warnings; 
my $fh; 
my $file_contents; 
my @info; 
open $fh, '<', "data" or die($!); 
local $/ = undef; 
$file_contents = <$fh>; 

while($file_contents =~ /.ame: (.*?)$(.*?).ame: (.*?)$/smg) 
{ 

    my $displayname = $1; 
    my $username = $3; 
    $displayname =~ s/^\s+//; #clean off any whitespace from front/back 
    $displayname =~ s/\s+$//; 
    my ($firstname, $lastname) = split(/\s+/, $displayname); #split on whitespace 

    print "$firstname\t$lastname\t$username\n"; #note the tabs 
} 
+0

第8行没有这样的文件或目录,不太确定这里发生了什么。 – Melignus 2010-05-14 00:57:10

+0

@melingnis:它读取一个名为data的文件 - – 2010-05-14 13:51:09