2013-10-09 2 views
-2

У меня есть файл данных, в котором указаны даты. Даты указаны в формате m/d/yyyy. Пример приведен ниже:Извлечение месяца и дня с даты с помощью Perl

1/1/2011 
1/10/2011 
10/1/2011 
10/10/2011 

Мой вопрос, как я могу извлечь месяц и день, так что я могу хранить его в другом файле в двух отдельных столбцах? Например, я хотел бы показать, как

Month Day 
1  1 
1  10 
10  1 
10  10 
+2

Вы должны быть в состоянии легко сделать это с помощью 'split'. – squiguy

+5

** Попробуйте написать что-то самостоятельно **, а затем, если это не сработает, покажите нам, что вы сделали, чтобы мы могли помочь вам. Вы начинаете, мы помогаем. Мы не пишем его для вас. Покажите нам фактический код, который вы пробовали, а затем мы можем вам помочь. Скорее всего, вы получите довольно близко к ответу, если сначала попробуете сами. –

ответ

0

Если предположить, что все даты тот же формат, то вам не нужно даже регулярное выражение. Общий вид решения заключается в следующем:

my ($month, $day, $year) = split([email protected]/@, $date); 

Если вы читаете из файла dates.txt, вы можете использовать его таким образом:

open my $DATES, '<', 'dates.txt' 
    or die "Couldn't open dates.txt: $!\n"; 

while (my $date = <$DATES>) { 
    $date =~ [email protected]\r|\[email protected]@g; # get rid of trailing newlines, however formatted 
    my ($month, $day, $year) = split([email protected]/@, $date); 
    # whatever you need to do with the date parts, do here 
}; 

close DATES; 

Советуйте, что за академический честь Вашего образовательного учреждения политики, вам может потребоваться указать этот ответ переполнения стека в качестве справки, когда вы включаете домашнее задание, испытываете боль от различных наказаний вплоть до и, возможно, в том числе изгнания.

0

Использование perl

perl -pe 's#(\d+)/(\d+)/\d+#$1\t$2#' file > new_file 

Использование sed

sed -r 's#([0-9]+)/([0-9]+)/[0-9]+#\1\t\2#' file > new_file 
-1

Использование split с ломтиком:

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature 'say'; 

for my $date (qw(1/1/2011 
       1/10/2011 
       10/1/2011 
       10/10/2011)) { 
    say join "\t", (split m{/}, $date)[0, 1]; 
} 
+0

'use strict' и неявный' $ _'? Интересная комбинация. –

+0

@AaronMiller: ОК, добавлено имя. – choroba

1

my ($Day, $Month, $Year) = split(m{/}, $Line);

0

Я считаю, что, вместо того чтобы использовать split, это является ясным, чтобы извлечь все числовые поля из строки с помощью регулярных выражений

my ($m, $d, $y) = $date =~ /\d+/g; 

Здесь полная программа, показывающая идею.

use strict; 
use warnings; 

my @dates = qw< 
    1/1/2011 
    1/10/2011 
    10/1/2011 
    10/10/2011 
>; 

print "Month Day\n"; 

for (@dates) { 
    my ($m, $d, $y) = /\d+/g; 
    printf "%-7d %-7d\n", $m, $d; 
} 

выход

Month Day 
1  1  
1  10  
10  1  
10  10  
Смежные вопросы