Perl 将文本文件转换为excel文件以获取大量数据

Perl 将文本文件转换为excel文件以获取大量数据,perl,Perl,我想写一个脚本,它将从平面文件中获取数据并将其写入excel。我的代码在下面 #!/usr/bin/perl use strict; use warnings; use Spreadsheet::WriteExcel; my $workbook = Spreadsheet::WriteExcel->new( 'deep.xls' ); my $worksheet = $workbook->add_worksheet(); $worksheet->write( 0, 0,

我想写一个脚本,它将从平面文件中获取数据并将其写入excel。我的代码在下面

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

use Spreadsheet::WriteExcel;
my $workbook  = Spreadsheet::WriteExcel->new( 'deep.xls' );
my $worksheet = $workbook->add_worksheet();

$worksheet->write( 0, 0, "DEEP" ) ;
$worksheet->write( 0, 1, "RIJU" );
$worksheet->write( 1, 0, "Sukhi" );
$worksheet->write( 1, 1, "Abhilash" );

$workbook->close;
我的平面文件包含以下内容

FILE_NAME                   Start_Timestamp     End_Timestamp   Record Count    Inbound/Outbound
OmahaTran.txt               1/25/2018 3:40      1/25/2018 3:40  90390           Inbound
concord                     1/24/2018 20:50     1/24/2018 20:50 8631            Inbound
iDine:RewardsNetwork 5220   1/24/2018 12:01     1/24/2018 12:04 218985          Outbound
nashville                   1/25/2018 4:30      1/25/2018 4:32  6810            Inbound
nstrans0.20180125           1/25/2018 2:00      1/25/2018 2:00  124573          Inbound

由于我是perl新手,有谁能帮助我从文本文件中检索“文件名”、“结束时间戳”和“记录计数”列,并将其写入excel?您可以将输入解析为固定宽度的文件。你已经知道如何写excel一旦你有了字段

parse_fixed.pl

#!/usr/bin/env perl

use warnings;
use strict;

my $usage = "usage: $0 file\n";
my $file = $ARGV[0] or die $usage;
-f $file or die $usage;

# Create $workbook and $worksheet objects here.

open my $fh, "<$file" or die "Unable to open '$file' : $!";
while(my $line = <$fh>) {
    chomp($line);
    # Unpack the fields, first field 27 chars, then 19 chars, etc.
    # perldoc -f pack
    my @fields = unpack("A27 A19 A17 A16 A20", $line);

    # Remove leading and trailing whitespace for each field
    # perldoc -f map
    # perldoc perlretut
    my ($file_name, $start, $stop, $record_count, $direction)
        = map { s|^\s*||; s|\s*||; $_ } @fields; 

    print("filename: '$file_name', start: '$start', stop: '$stop', record_count: '$record_count', direction: '$direction'\n");

    # Add $worksheet->write(...) lines for each field here.

}

# Close $workbook here.


这是我经常使用的一种模式,用于将固定宽度字段转换为逗号分隔的值。当然,Excel很乐意导入此CSV数据,为您完成大部分工作

它假定字段从一个标题字符串的开头延伸到下一个标题字符串的开头,并使用内置数组
@-
确定每个标题字符串的起始位置。标题字符串可以包含单个空格;多个连续空格终止字符串

我希望清楚的是,
$template
的值只打印用于诊断,而不是CSV数据的一部分

删除
print
语句很简单,如果不需要,该语句将输出逗号分隔的标题字符串。或者,如果需要,在导入后从电子表格中删除该行也很简单

数据
文件句柄用于方便和演示。通常,您可能希望
打开一个特定的文件并使用该文件句柄,或者仅使用
读取指定为命令行参数的文件

使用严格;
使用“全部”警告;
使用特征“说”;
我的$head;
我的$template=do{
$head=;
我的@模板;
我的$prev;
而($head=~/\S+(?:[]\S+*/xg){
推送@template,定义为$prev?'A'($-[0]-$prev):'@'$-[0];
$prev=$-[0];
}
推送@template,“A*”;
“@模板”;
};
说qq{Pack format“$template”\n};
说join',解包$template,$head;
而(){
说出join',解包$template,$\;
}
__资料__
文件名开始时间戳结束时间戳记录计数入站/出站
OmahaTran.txt 2018年1月25日3:40 2018年1月25日3:40 90390入境
康科德2018年1月24日20:50 2018年1月24日20:50 8631入境
IDE:报酬网络5220 2018年1月24日12:01 2018年1月24日12:04 218985出站
纳什维尔2018年1月25日4:30 2018年1月25日4:32 6810入境
nstrans0.20180125 1/25/2018 2:00 1/25/2018 2:00 124573入境
输出
Pack格式“@0 A28 A20 A16 A16 A*”
文件名、开始时间戳、结束时间戳、记录计数、入站/出站
OmahaTran.txt,2018年1月25日3:40,2018年1月25日3:4090390,入境
康科德,2018年1月24日20:50,2018年1月24日20:508631,入境
IDE:报酬网络5220,1/24/2018 12:01,1/24/2018 12:04218985,出境
纳什维尔,2018年1月25日4:30,2018年1月25日4:326810,入境
nstrans0.20180125,1/25/2018 2:00,1/25/2018 2:00124573,入境

你有一个很好的答案,但是“大量数据”又有什么关系呢?如果文件很大,你可以不用像
电子表格::WriteExcel那样在写出来之前把所有数据都放到内存中,而是一行一行地打印出csv文件,Excel应该可以导入这些文件。这样,不管文件有多大。@xxfelixxx啊,谢谢。我不知道模块占用了整个文件。@zdim实际上这是基于使用模式的猜测……阅读文档表明这可能不是完全正确的……它似乎试图在编写临时文件的过程中加快速度。我在您的脚本之后添加了以下内容------->my$工作簿=电子表格::WriteExcel->new('deep.xls');我的$worksheet=$workbook->add_worksheet();$worksheet->write(0,0,$file_name);$worksheet->write(0,1,$stop);$worksheet->write(0,2,$record_count)$WORKWORK->close;我在excel nstrans0.20180125 1/25/2018 2:00 124573中得到以下输出,但我需要3列中的所有记录。您能帮我找出问题所在吗?您迭代每行,调用
$WORKWORK->write(..)
在循环内。将
$worksheet->close
放在循环外。非常感谢。我现在可以获取所有数据了
perl parse_fixed.pl input

filename: 'FILE_NAME', start: 'Start_Timestamp', stop: 'End_Timestamp', record_count: 'Record Count', direction: 'Inbound/Outbound'
filename: 'OmahaTran.txt', start: '1/25/2018 3:40', stop: '1/25/2018 3:40', record_count: '90390', direction: 'Inbound'
filename: 'concord', start: '1/24/2018 20:50', stop: '1/24/2018 20:50', record_count: '8631', direction: 'Inbound'
filename: 'iDine:RewardsNetwork 5220', start: '1/24/2018 12:01', stop: '1/24/2018 12:04', record_count: '218985', direction: 'Outbound'
filename: 'nashville', start: '1/25/2018 4:30', stop: '1/25/2018 4:32', record_count: '6810', direction: 'Inbound'
filename: 'nstrans0.20180125', start: '1/25/2018 2:00', stop: '1/25/2018 2:00', record_count: '124573', direction: 'Inbound'