Заменить текст после n-й запятой на ноль - PullRequest
1 голос
/ 01 ноября 2011

У меня есть файл с сотнями операторов вставки SQL, например

INSERT INTO dbname.dbo.tbl1(col1, col2, col3,...., coln,...) VALUES (val1, val2, val3,....,valn,....)

Мне нужно заменить «valn» на «null» во всех операторах вставки.

Примечание: "valn" появляется после (n-1) -ой запятой.

Как мне добиться этого в Perl?

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

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

Существует многоопций и функциональности для модуля Text :: CSV_XS , и он может быть немного инвазивным, но его, вероятно, можно настроить для работы с вашими данными.Попробуйте что-нибудь в этом духе.Обязательно сохраняйте резервные копии.

Использование: script.pl input.txt > output.txt

Код:

use strict;
use warnings;
use Text::CSV_XS;

while (<>) {
    my $csv = Text::CSV_XS->new ({
        binary => 1,
        keep_meta_info => 1,
        allow_whitespace => 1,
    });
    my ($pre, $str, $post) = /^(.* VALUES *\()([^)]+)(\).*)$/;
    $csv->parse($str);
    my @cols = $csv->fields();
    my $n = 4;   # The N-th field
    splice @cols, $n, 1, "null";
    $csv->combine(@cols);
    print $pre, $csv->string(), $post;
}
1 голос
/ 01 ноября 2011

perl -i.bak -pe's/,[^,]+,([^)]+)\)/,NULL,$1)/g' your.sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...