ヌル

2011-10-31 5 views
1

とn番目のコンマの後にテキストを交換し、私は私がすべての挿入文に「ヌル」と「のVirtual Local Area Network」を交換する必要がヌル

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

のようなSQL INSERTステートメントの何百ものファイルを持っています。

注:「valn」は(n-1)番目のカンマの後に表示されます。

どうすればこの問題を解決できますか?

+0

は、あなたのデータは、おそらくその中のカンマで、引用符で囲まれた文字列が含まれていることはできますか? – TLP

+0

@TLP - はいできます – nvarchar

+0

[Text :: CSV_XS](http://search.cpan.org/perldoc?Text::CSV_XS)のように、解析にCSVモジュールを使用する必要があります。 – TLP

答えて

1

あなたが引用されたカンマが含まれている可能性のあるデータを持っている場合は、簡単な正規表現は十分ではありません。他のソリューションを試してみることもできますが、文字列のその部分にText::CSV_XSなどのCSVモジュールを使用するのが最善の方法です。

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; 
} 
+0

@ TLP複数行の値を持つ値val(n + 1)がある場合、エラーが発生します。** splice()オフセットは配列の末尾のremove-blobs.pl行20、行1です。未初期化値$プレを印刷するにはremove-blobs.pl行23、 lin e 1。** たとえば、 'INSERT INTO dbname.dbo.tbl1(col1、col2、col3、col4、 VALUES(null、 '2011-10-06 17:09:05.0'、6、 '[email protected]'、1、null、19、12d2d0d0a、 '0行目、0行目、0行目、 line1 line2 .. '、' [email protected] '); – nvarchar

+0

@nvarcharその入力は私のために働きます(n = 4)。あなたは偶然あなたの入力に空白行を持っていますか? – TLP

+0

申し訳ありません。私は入力の改行が欠けていました。入力は、** INSERT INTO dbname.dbo.tbl1(col1、col2、col3、col4、col5、col6、col7、col8、col9、col10)VALUES(null、 '2011-10-06 17:09:05.0 '、6、' [email protected] '、1、null、19、12d2d0d0a、'行0 \ n行1 \ n行2 .. '、' [email protected] '); ** – nvarchar

1

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