2015-06-19 59 views
-1

我需要在一个文件名的特定词应该从文件名称目录中拉出我想具体的字将被存储在一个CSV文件

!/usr/bin/perl -w 

my $directory = "/home/grds/datafiles"; 
opendir(DIR, $directory) or die "couldn't open $directory: $!\n"; 
@files = grep("EXP", readdir(DIR)); 
closedir(DIR); 

foreach $file (@files) { 
    # print "$file\n"; 
     open ($file 
} 

示例文件名:

EXPresult_3D0R0000002345_test345_cache1_IND0000ASD123_2014_04_12_18_56_1 

我需要

3D0R0000002345, test345, cache1, IND0000ASD123, 2014_04_12 

应该存储在带有单独列的Excel文件中。

+0

什么分隔文件中的文本? – sln

+0

输出文件是否需要使用Excel特定的格式(xls/xlsx),还是使用结构化文本格式(csv)? –

+0

它也可以是csv格式tooo – Priya

回答

1

这是相当简单的,如果你想要的是一个CSV输出

这个程序会检查每个目录项目是一个文件(不是目录),并且在名称中包含EXP,然后将其分解上下划线_最多六个字段。这使得尾部的日期 - 时间完好为单个场

然后,第一场被移除时,时间是从最后一个字段剥离,和所有剩余的字段被印刷,以逗号,

我已经使用加入autodie它不需要检查opendir

use strict; 
use warnings; 
use 5.010; 
use autodie; 

use File::Spec::Functions 'rel2abs'; 

use constant DIRECTORY => '/home/grds/datafiles'; 

opendir my $dh, DIRECTORY; 

while (my $node = readdir $dh) { 

    my $fullpath = rel2abs($node, DIRECTORY); 
    next unless -f $fullpath and $node =~ /EXP/; 

    my @fields = split /_/, $node, 6; 
    next unless @fields == 6; 

    shift @fields; 
    $fields[-1] =~ s/\d+_\d+_\d+\K.*//; 

    print join(',', @fields), "\n"; 
} 

输出的成功

3D0R0000002345,test345,cache1,IND0000ASD123,2014_04_12 
+0

谢谢,因此真的帮助我。 – Priya

1

我刚写过使用Excel :: Writer :: XLSX,你需要安装这个模块来运行这个脚本,如果已经不可用的话。如果您需要更多功能,您还可以在cpan上查看此模块。

#!/usr/bin/perl 

use strict; 
use Excel::Writer::XLSX; 

my $k   = 0; 
my $reportfile = "report.xlsx"; 
my $workbook = Excel::Writer::XLSX->new($reportfile); 
die "Problems creating new Excel file: $!" unless defined $workbook; 
my $worksheet = $workbook->add_worksheet(); 

# Excel Format 
my $format = $workbook->add_format(); 

my @val; 
opendir(my $dir, "./test/"); 
my @file = grep(/EXP/, readdir($dir)); 
while (<@file>) { 
    @val = split(/_/, $_); 
    print "$val[1] $val[2] $val[3] $val[4] $val[5]_$val[6]_$val[7]\n"; 
    $format->set_align('top'); 
    $worksheet->write($k, 0, "$val[1]",     $format); 
    $worksheet->write($k, 1, "$val[2]",     $format); 
    $worksheet->write($k, 2, "$val[3]",     $format); 
    $worksheet->write($k, 3, "$val[4]",     $format); 
    $worksheet->write($k, 4, "$val[5]_$val[6]_$val[7]", $format); 
    $k++; 
} 
+0

顺便说一句,我没有测试过,希望它应该工作..... :) – chetangb

+0

我可以有CSV文件,而不是Excel文件。我很抱歉,我没有excel写道:XLSX没有安装在实验室电脑 – Priya

+0

您可以在您的实验室PC上使用cpan -i Excel :: Writer :: XLSX安装模块,或者联系您的系统管理员。我没有试过CSV,可能试着在cpan中查看“Text :: CSV”模块。 – chetangb

相关问题