2016-08-10 5 views
0

私は1つの変数を複数の変数(最大長2000)に分割する必要があります。 は、例えば、私の文字列は、私が使用して長さが10000000(10メガバイト)を持つ:プロシージャのループでループ

proc sql; 
create table str as 
    select 
    substr(string,2000,1) as field1, 
    substr(string,2000,2001) as field2, 
    ....... 
from data_table 

は、私はこれらのフィールド1-field5000を書くことではないselect文でループを書くことができます。 ありがとうございました!

+0

この長い文字列のソースは何ですか?データベーステーブルですか? – fl0r3k

+0

@ fl0r3kはい、データテーブルですが、私はデータテーブルではなく、proc SQLのみを使用する必要があります – bobby1232

+0

どこにこのテーブルが存在していますか?私はmysqlやoracleのようなデータベースですか? – fl0r3k

答えて

1

まず

substr()機能は3つの引数proc sql

セカンド

substr(string, position <, length>) 

    string - string constatn or field 
    position - starting position 
    length - length of the string you want to return 

あなたが唯一のマクロ言語は、あなたがマクロプログラムを記述する必要がありますループを使用することができますかかります。

options mprint; 

%macro substrLoop; 
%let length = 2000; 
%let endLoop = %eval(1000000/&length.); 

proc sql; 
    create table str as 
     select 
     %do i = 1 %to &endLoop.; 
     substr(string, %eval(1 + (&i.-1)*&length.),&length.) as field&i. 
     %if &i ne &endLoop. %then ,; 
     %end; 
    from data_table; 
quit; 
%mend substrLoop; 

%substrLoop 

説明

options mprint;

と呼ばれるマクロ

%let length = 2000;

%let endLoop = %eval(1000000/&length.);

設定MACによって生成されたログ・コードに表示することができ部分文字列の長さとループの終了時間を計算するためのarovariables。 SQLコードにsubstr(string, 1,2000) as field1 ,substr(string, 2001,2000) as field2 ,等計算フィールドをputing

%do i = 1 %to &endLoop.; 
    substr(string, %eval(1 + (&i.-1)*&length.),&length.) as field&i. 
    %if &i ne &endLoop. %then ,; 
%end; 

実際ループ。

%if &i ne &endLoop. %then ,;は、最後に生成されたフィールドの後にコンマを入れないようにするために必要です。

+0

で作業しています。今、エラーが発生しました:メモリが不足しています。 READBUFF/INSERTBUFF/UPDATEBUFFオプションの値を減らしてみてください。どのように私はそれを防ぐことができます知っていますか? – bobby1232

+0

これらのオプションはエンジン固有です。 1.あなたが寄付している図書館をどのように割り当てていますか?それは管理者によって行われるのでしょうか、あなたはあなた自身の 'LIBNAME'を書くでしょうか? 2.結果をoracleに格納しますか? – fl0r3k

関連する問題