Perl "чистит" символы при разборе
Я разбираю файл - первым делом я соединяю первые три поля и добавляю их к каждой записи. Затем я хочу очистить данные любых двоеточий, одинарных кавычек, двойных кавычек или обратной косой черты. Вот как я это делаю, но есть ли способ сделать это с помощью переменной $line, которая была бы более эффективной?
# Read the lines one by one.
while($line = <$FH>) {
# split the fields, concatenate the first three fields,
# and add it to the beginning of each line in the file
chomp($line);
my @fields = split(/,/, $line);
unshift @fields, join '_', @fields[0..2];
# Scrub data of characters that cause scripting problems down the line.
$_ =~ s/:/ /g for @fields[0..39];
$_ =~ s/\'/ /g for @fields[0..39];
$_ =~ s/"/ /g for @fields[0..39];
$_ =~ s/\\/ /g for @fields[0..39];
2 ответа
Что будет чище для меня:
while($line = <$FH>) {
chomp($line);
$line =~ s/[:\'"\\]/ /g;
my @fields = split(/,/, $line);
unshift @fields, join '_', @fields[0..2];
}
И, как сказал @HunterMcMillen, если это стандартный CSV-файл, лучше использовать модуль синтаксического анализа. Это будет легче в будущем.
Я уверен, что я видел очень похожий вопрос раньше, но мои простые поиски не найдут его. Что выделяется, так это добавление нового поля перед остальными, которое является функцией исходных значений.
Вы описали это лучше всего в терминах Perl
unshift @fields, join '_', @fields[0..2];
так что остался только один шаг - удаление мошеннических символов - одинарные и двойные кавычки, двоеточия и обратная косая черта
Ваш код, кажется, работает нормально. Единственные изменения, которые я сделал бы, были бы
Используйте переменную по умолчанию
$_
должным образом. Я думаю, это то, что новички больше всего ненавидят в Perl, а потом полюбят больше всего, когда поймутиспользование
tr///d
вместоs///
, Это может добавить немного скорости, но больше всего освобождает вас от синтаксиса регулярных выражений, когда вы просто хотите сказать, какие символы удалить, и нужно что-то более простое
Я думаю, что это должно делать то, что вам нужно
use strict;
use warnings 'all';
while ( <DATA> ) {
chomp;
my @fields = split /,/;
unshift @fields, join '_', @fields[0..2];
tr/:"'\\//d for @fields; # Delete colons, quotes, and backslash
print join(',', @fields), "\n";
}
__DATA__
a:a,b"bb",c'ccc',ddd,e,f,g,h
выход
aa_bbb_cccc,aa,bbb,cccc,ddd,e,f,g,h