ダンプファイルのSQL挿入コマンドから2つの列を削除する

ダンプファイルのSQL挿入コマンドから2つの列を削除する

複数の挿入コマンドを含むSQLダンプファイルがあります。削除したいです。sedまたはgrep(または別のシンプル強く打つ技術)、条項の特定の列、およびそれに対応するデータVALUES。したがって:

INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);

sedまたはgrepは"mslink"列とその値を削除する必要があります。どちらも場所4"189"にあります。価値がない不要な列の元の場所がわかりません。したがって、正規表現はある種のメモリを使用して削除する必要があります。n番目クエリ値はN場所"mslink"

一つ不完全 sedコマンドは次のとおりです。

sed -re 's/INSERT INTO "capt" \((.*,?)*"mslink",?(.*,?)*\) VALUES \((.*,?)+\);/INSERT INTO "capta" (\1\2) VALUES (\3)/' file.sql

答え1

私はこれを行うことができるPerlコードの1行を考えることはできませんが、ここにあなたが望むものを実行するPerlスクリプトがあります。

$matchを検索したいものに変更してください。このスクリプトはファイル全体を繰り返し、結果ファイルを標準出力に出力します。結果をファイルにパイプすると、変更が適用されます。コードについてもっとコメントしたいと思いました。すみません。

スクリプトは括弧内にデータがあり、カンマで区切られたキーワード「VALUES」を使用します。それ以外の場合は失敗する可能性があります。

コードが "sql_parser.pl" として保存されている場合は、%>perl sql_parser.pl [file] コマンドを実行します。

#!/usr/bin/perl
#
use strict;

sub usage
{
    print "usage: sql_parser.pl [file]\n";
}

# load the input file
sub load
{
    my $file = shift;
    open my $in, "<", $file or die "unable to open $file as input $!";
    my @data = <$in>;
    close $in;
    foreach (@data) { chomp; s/\cM//g; }
    return @data;
}

# what to search for
# could supply this parameter on the command line too
# my $match = shift; 
my $match = 'mslink';

# get the file to process on the command line
my $file = shift;
{
    # load the data
    my @lines = &load($file);

    #print "$_\n" foreach (@lines);

    # loop through the data in the file
    foreach (@lines)
    {
        # match the line of text
        my @f = m/(.*?\() (.*?) (\)\s+?VALUES\s+?\() (.*?) (\).*?$)/x;
        if (@f)
        {
            my @cmds = split /,/, $f[1];
            my @nums = split /,/, $f[3];
            my $matched = 0;
            for ( my $i = 0; $i < @cmds; ++$i )
            {
                if ( $cmds[$i] =~ /$match/ )
                {
                    #print "$cmds[$i]\n";
                    undef $cmds[$i];
                    undef $nums[$i];
                    $matched = 1;
                    last;
                }
            }
            ( $f[1] = join ',', @cmds ) =~ s/\,\,/,/;
            ( $f[3] = join ',', @nums ) =~ s/\,\,/,/;
            if ($matched)
            {
                $_ = join ' ', @f;
            }
        }
    }
    print "$_\n" foreach (@lines);
}

このデータに対して次のスクリプトを実行しました。

INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);

$perl sql_parser.pl test.dat 出力は次のようになります。

INSERT INTO "capt" ( "fid_c1","id","fid_capt","capt", ... ) VALUES ('0','0','24','CAP.FU1', ... );

キャプチャ出力:$ perl sql_parser.pl test.dat> Capture.txt

関連情報