Заполните пустые данные до конца строки - PullRequest
0 голосов
/ 26 июня 2018

Я обрабатываю некоторые CSV-файлы.В последнем поле иногда отсутствуют данные, например: first,last John,Smith Francis,

Это приводит к ошибкам приема при попытке загрузки в базу данных.Я хотел бы добавить пробел или какой-нибудь другой «заполнитель» после последней запятой, до crlf, но у меня возникают проблемы с заполнением поиском / заменой.Например, я пробовал следующее: $data =~ s/,\x0d\x0a/,\x20\x0d\0xa/gi, но до crlf не добавляется пробел.Конечно, мне нужно сохранить конец строки, чтобы строки были правильно помечены.

Я пробовал читать с помощью Path :: Tiny, а также универсальный open, но пока безуспешно.

1 Ответ

0 голосов
/ 26 июня 2018

Во-первых: используйте модуль для работы с CSV-файлами, и хорошим будет Text :: CSV

Теперь для такой работы, на этот раз, простой фильтрвсе в порядке:

my $line = q(first,last John,Smith Francis,);

$line =~ s/.*,\K$/filled_last_field/; 

Жадный .* соответствует до последнего экземпляра следующего шаблона (запятая здесь) в строке.\K форма положительного взгляда за спиной отбрасывает все предыдущие совпадения, поэтому они не расходуются;поэтому он заменяет шаблон только после него (при необходимости добавляет фразу в этом случае).

Если вы хотите сначала заменить файл, вы читаете его построчно и записываете измененные строки вновый файл, который затем перемещается поверх старого.

open my $fh, '<', $file or die "Can't open $file: $!";
open my $fh_out, '>', $new_file or die "Can't open $new_file: $!";

while (<$fh>) {
    print $fh_out s/.*,\K$/filled_last_field/r;
}
# Move $new_file to $file

, где я использовал модификатор /r , который возвращает измененную строку, как раз для print Вот.См. этот пост и этот пост (например) для полных программ такого рода с соответствующими деталями.

Или с Path :: Tiny

path($file)->edit_lines( sub { s/.*,\K$/ADDED/ } )

Методы для непосредственного редактирования файла были добавлены в версии 0.077.Многие из методов модуля имеют свои _utf8 аналоги, а также есть edit_lines_utf8 .


В однострочном

perl -wpe's/.*,\K$/ADDED/' file.csv > new_file.csv

или,изменить входной файл на месте

perl -i -wpe's/.*,\K$/ADDED/' file.csv

или изменить его, а также сохранить резервную копию

perl -i.bak -wpe's/.*,\K$/ADDED/' file.csv
...