PERL中数据提取

目前面临以下数据结构(txt格式)
文件名:1.txt
1995 1994 1993
item1 100 200 300
item2 300 400 450
文件名:2.txt
1995 1994
item1 500 600
item2 700 900
item3 1000 3000
第一行是年度,但是没有对应的说明。
字段、数据之间是用空格隔开。
相关文件共有1000多个。
要求:用perl提取相应的年度/项目/数据信息,保存到CSV文件中。
文件名 项目名 1995 1994 1993

1 item1 100 200 300
1 item2 300 400 450
2 item1 500 600
2 item2 700 900
3 item3 1000 3000

谢谢!

#!perl
use Win32::OLE qw(in with);
my $file1 = "C:/Users/Administrator/Desktop/1.txt";
my $file2 = "C:/Users/Administrator/Desktop/2.txt";
my $fileOut = "C:/Users/Administrator/Desktop/output.xls";
my $cellnamef = "文件名";
my $cellnamep = "项目名";
my $fileline = 1;
my $sheet = 1;#第几个页
my $row =1;
my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $BookOut = $Excel->Workbooks->Open($fileOut);
my $WorkSheetOut = $BookOut->Worksheets($sheet);
sub exportData{
my $file = @_[0];
my $col =1;

open HANDLE, $file;

$WorkSheetOut->Cells($row,1)->{Value} = $cellnamef;
$WorkSheetOut->Cells($row,2)->{Value} = $cellnamep;
$col =1+2;

while(<HANDLE>){
my $line = $_;
my $filename = (split /\//,$file1)[-1];

if($col == 1){
$WorkSheetOut->Cells($row,$col)->{Value} = $filename;
print "$row, $col, $filename\n";
$col = $col +1;
}
while($line =~ m/(\w+)/g){
$WorkSheetOut->Cells($row,$col)->{Value} = $1;
print "$row, $col, $1\n";
$col = $col +1;
}

$row = $row +1;
$col = 1;
}
close(HANDLE);
}

exportData $file1;
exportData $file2;
$BookOut->Save();
$BookOut->Close();
$Excel->Quit();
print "over!";

结果还要手动改下。代码写的不是太好追问

运行了上述程序,出现以下结果:
can't call method "Worksheets" on an undefined value at table_extract.pl line 13.
看了Win32-OLE的帮助说明,上面的程序没有问题的。
请教该如何解决?
再次感谢!

追答

哦,你在my $fileOut = "C:/Users/Administrator/Desktop/output.xls";在桌面建一个output.xls先。或者你把数据给我,我帮你合了,哈哈

追问

谢谢!已经基本搞定了。
可否请你帮忙,写成一个循环语句,每个文件输出一张表格,然后我再用其他程序读入每张表格。这样可能比在PERL中做成一张表格更为方便。
另,可否将年度变量1995、1994之前加上字符,转换成YEAR1995/YEAR1994?
多谢!

追答

你的意思是1.txt,2.txt都生成一个对应的excel文件么?

追问

是的。因为我后面的数据中,年度会发生变化,比如3.txt中,年度就是1996 1995 1994。所以我想还是用每个txt生成一个excel表,然后再合并,比较方便。谢谢!

追答

好的,明天看看,下班了

温馨提示:内容为网友见解,仅供参考
无其他回答

请教如何用perl截取这样的数据
如果是一定包含 step2 step3并且你要的一定是step2和step3之间的东西 !\/usr\/bin\/perl use strict;use warnings;my $str1='step2';my $str2='step3';my $text='step1 Steve Blenheim:415-444-6677:12 Main St.Betty Boop:303-223-1234:234 Ethan Ln.Igor Chevsky:408-567-4444:3456 Mary...

用perl 提取根据第一列名字提取第二列的数据,求可实现的程序_百度知 ...
简单,用哈希就行了 open(IN,$file);while(<IN>){ chomp;my $name=(split \/\\s+\/,$_)[0];hash{$name}=$_;} close IN;假如你要某一行的内容,就print $hash{$name};###$name是某一列的名字

perl提取特定文本内容
lines是一个数组,里面是文件中的每一行的内容。对该数据的操作方法是 foreach $line (@lines) # 循环读取每一行{ ... # $line是一行的内容} 读到每一行后,对该行进行操作,使用split函数进行拆分。对于不行的文件格式,有不同的拆分方法,你应该看一行列的拆分方式,比如是用的逗号分...

如何用perl访问二维表格,并提取其中的三列数据?
你这个数据看起来是文本,可以用记事本打开确认,如果是文本数据,PERL读取是很容易的,open打开文件,以行为单位读入,使用split分为数组,然后取你需要的就可以了,大概的代码如下:my ($str,@arr);open(FD,'xxx.txt');while($str=<FD>){ @arr=split(\/\\s+\/,$str); print $arr[1]....

PERL中数据提取
$row,$col)->{Value} = $1;print "$row, $col, $1\\n";col = $col +1;} row = $row +1;col = 1;} close(HANDLE);} exportData $file1;exportData $file2;BookOut->Save();BookOut->Close();Excel->Quit();print "over!";结果还要手动改下。代码写的不是太好 ...

perl取文本中一部分数据。
while ( <FILE> ) { next unless $_ =~ \/^Administrative Contact\/;my $end = undef;while ( ! $end ) { my $line = <FILE> ;end = 1 if $line =~ \/^Technical Contact\/;print $line unless $end } }

perl语言中怎么取到变量四个字节之后的数据
substr是取子串的,第4个之后的内容用:substr($s, 4)

通过Perl,以文件中一列的信息作为关键词依次向另一文件中提取出与之...
可以,先把第一个文件分行存为一个哈希,然后读取第二个文件,对于第二个文件中的每一行,对哈希进行一个正则匹配,匹配到就输出,没匹配到就next,望采纳

如何使用写perl脚本,将在数组a里面的字符在数组b里面的数据选出来
少侠,你的数组定义有问题,应该是y @a=("a","b","c");和@b=("a","d","e","f");其他的好像没什么问题 望采纳 具体代码如下:use strict;my @a=("a","b","c");my @b=("a","d","e","f");print "@a\\n";foreach my $a(@a){ foreach my $b(@b){ if($...

perl提取多个文本数据并整齐排列
\\w+)?) *=\/msg) {$col{$1} = $col{-col}++ if (!exists $col{$1});}#2 find data, if has all columes printwhile ($$t =~\/(\\w+(,\\w+)?) *= *([\\d\\.]+)\/msg) {$col[$col{$1}] = $3;$fill++;if ($fill >= $col{-col}) {$fill = 0;print join(...

相似回答
大家正在搜