Нет причин беспокоиться о фактической дате или вообще использовать функции даты здесь. Вы хотите разделить ваши данные на основе частичного значения одного из столбцов в данных. Так случилось, что это дата.
NAME08;2018/06/26;16:03:57 # This goes to 2018-06/
NAME09;2018/06/26;16:03:57 #
NAME02;2018/06/27;16:58:12 #
NAME03;2018/07/03;07:47:21 # This goes to 2018-07/
NAME21;2018/07/03;10:53:00 #
NAMEXX;2018/07/05;03:13:01 #
NAME21;2018/07/05;15:39:00 #
Самый простой способ сделать это - перебрать ваши входные данные, а затем вставить их в хеш с ключами для каждой комбинации года и месяца. Но вы говорите о файлах журналов, и они могут быть большими, так что это неэффективно.
Вместо этого мы должны работать с разными файловыми дескрипторами.
use strict;
use warnings;
my %months = ( 6 => 'June', 7 => 'July' );
my %handles;
while (my $row = <DATA>) {
# no chomp, we don't actually care about reading the whole row
my (undef, $dir) = split /;/, $row; # discard name and everything after date
# create the YYYY-MM key
$dir =~ s[^(....)/(..)][$1-$months{$2}];
# open a new handle for this year/month if we don't have it yet
unless (exists $handles{$dir}) {
# create the directory (skipped here) ...
open my $fh, '>', "$dir/filename.csv" or die $!;
$handles{$dir} = $fh;
}
# write out the line to the correct directory
print { $handles{$dir} } $row;
}
__DATA__
NAME08;2018/06/26;16:03:57
NAME09;2018/06/26;16:03:57
NAME02;2018/06/27;16:58:12
NAME03;2018/07/03;07:47:21
NAME21;2018/07/03;10:53:00
NAMEXX;2018/07/05;03:13:01
NAME21;2018/07/05;15:39:00
Я пропустил часть о создании каталога, поскольку вы уже знаете, как это сделать.
Этот код также будет работать, если ваши строки данных не являются последовательными. Это не самый эффективный метод, так как количество дескрипторов будет увеличиваться по мере увеличения количества данных, но если у вас их нет одновременно, это не имеет значения.
Примечания:
- Вам не нужно
chomp
, потому что вам не нужно работать с последним полем.
- Вам не нужно присваивать все значения после
split
, потому что вы не заботитесь о них.
- Вы можете отказаться от значений, присвоив их
undef
.
- Всегда используйте дескрипторы файлов
open
и с тремя аргументами .
-
{}
в print { ... } $row
необходимы, чтобы сказать Perl, что это ручка, которую мы печатаем тоже. См http://perldoc.perl.org/functions/print.html.