2015-06-19 2 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

Btw, я не тестировал его, надеюсь, он должен работать ..... :) – chetangb

+0

Могу ли я иметь файл CSV, а не файл excel. Мне жаль, что у меня не было Excel: XLSX не установлен в лаборатории pc – Priya

+0

, вы можете установить модуль, используя cpan -i Excel :: Writer :: XLSX на своем компьютере лаборатории или обратитесь к системному администратору. Я не пробовал CSV, возможно, попытаюсь взглянуть на модуль «Text :: CSV» в cpan. – chetangb

Смежные вопросы