Используйте Regex для изменения определенного столбца в CSV - PullRequest
3 голосов
/ 11 марта 2012

Я хочу преобразовать некоторые строки в формате CSV в формате 0000-2400 часов в формат 00-24 часов.например,

2011-01-01,"AA",12478,31703,12892,32575,"0906",-4.00,"1209",-26.00,2475.00
2011-01-02,"AA",12478,31703,12892,32575,"0908",-2.00,"1236",1.00,2475.00
2011-01-03,"AA",12478,31703,12892,32575,"0907",-3.00,"1239",4.00,2475.00

В 7-м и 9-м столбцах указаны время отправления и прибытия соответственно.Предпочтительно строки должны выглядеть следующим образом:

2011-01-01,"AA",12478,31703,12892,32575,"09",-4.00,"12",-26.00,2475.00

Весь CSV будет в конечном итоге импортирован в R, и я хочу попробовать обработать часть обработки заранее, потому что она будет довольно большой.Сначала я пытался сделать это с помощью Perl, но у меня возникли проблемы с выделением нескольких цифр с регулярным выражением.Я могу получить одну цифру перед запятой с выражением «смотреть за спиной», но не более одной.

Я также открыт для того, чтобы мне говорили, что делать это в Perl - это излишне глупо, и я должен придерживаться R.:)

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Я также могу предложить свое собственное решение, которое

s/"(\d\d)\d\d"/"$1"/g
2 голосов
/ 12 марта 2012

Как я уже упоминал в комментариях, использование модуля CSV, например Text :: CSV , является безопасным вариантом. Это быстрый пример сценария того, как его использовать. Вы заметите, что он не сохраняет кавычки, хотя и должен, поскольку я вставил keep_meta_info. Если это важно для вас, я уверен, что есть способ это исправить.

use strict;
use warnings;
use Data::Dumper;

use Text::CSV;
my $csv = Text::CSV->new({
        binary => 1,
        eol => $/,
        keep_meta_info => 1,
});
while (my $row = $csv->getline(*DATA)) {
    for ($row->[6], $row->[8]) {
        s/\d\d\K\d\d//;
    }
    $csv->print(*STDOUT, $row);
}

__DATA__
2011-01-01,"AA",12478,31703,12892,32575,"0906",-4.00,"1209",-26.00,2475.00
2011-01-02,"AA",12478,31703,12892,32575,"0908",-2.00,"1236",1.00,2475.00
2011-01-03,"AA",12478,31703,12892,32575,"0907",-3.00,"1239",4.00,2475.00

Выход:

2011-01-01,AA,12478,31703,12892,32575,09,-4.00,12,-26.00,2475.00
2011-01-02,AA,12478,31703,12892,32575,09,-2.00,12,1.00,2475.00
2011-01-03,AA,12478,31703,12892,32575,09,-3.00,12,4.00,2475.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...