2016-04-12 4 views
1

保持されている値を連結しようとしています。 これはコードの私の部分である:SAS:文字列が位置955でトリムされている理由

data &_output.; 
set &_input.; 
by cpn; 
retain json_array; 
if first.cpn and last.cpn then do; 
    flag = 'both'; 
    concat = ('subscriptions:[{'||'"mpc" : "'||compress(mpc)||'" , '||'"contract_start_date" : "'||compress(contract_start_date)||'" '||' , "contract_end_date" : "'||compress(contract_end_date)||'"'||' , "subscription_status_code" : "'||compress(subscription_status_code)||'"'||' , '||'"promo_code" : "'||compress(promo_code)||'" '||' , "print_or_digi_flag" : "'||compress(print_or_digi_flag)||'"'||' , "payment_method_selection" : "'||compress(payment_method_selection)||'"'||', "subscription_type_code" : "'||compress(subscription_type_code)||'"'||' , "report_trial_subscription" : "'||compress(report_trial_subscription)||'"'||' , "product_desc" : "'||compress(product_desc)||'"}]'); 
end; 
else if first.cpn then do; 
    flag = 'first'; 
    concat = ('subscriptions:[{'||'"mpc" : "'||compress(mpc)||'" , '||'"contract_start_date" : "'||compress(contract_start_date)||'" '||' , "contract_end_date" : "'||compress(contract_end_date)||'"'||' , "subscription_status_code" : "'||compress(subscription_status_code)||'"'||' , '||'"promo_code" : "'||compress(promo_code)||'" '||' , "print_or_digi_flag" : "'||compress(print_or_digi_flag)||'"'||' , "payment_method_selection" : "'||compress(payment_method_selection)||'"'||', "subscription_type_code" : "'||compress(subscription_type_code)||'"'||' , "report_trial_subscription" : "'||compress(report_trial_subscription)||'"'||' , "product_desc" : "'||compress(product_desc)||'"} , '); 
end; 
else if last.cpn then do; 
    flag = 'last'; 
    concat = ('{"mpc" : "'||compress(mpc)||'" , '||'"contract_start_date" : "'||compress(contract_start_date)||'" '||' , "contract_end_date" : "'||compress(contract_end_date)||'"'||' , "subscription_status_code" : "'||compress(subscription_status_code)||'"'||' , '||'"promo_code" : "'||compress(promo_code)||'" '||' , "print_or_digi_flag" : "'||compress(print_or_digi_flag)||'"'||' , "payment_method_selection" : "'||compress(payment_method_selection)||'"'||', "subscription_type_code" : "'||compress(subscription_type_code)||'"'||' , "report_trial_subscription" : "'||compress(report_trial_subscription)||'"'||' , "product_desc" : "'||compress(product_desc)||'" }]'); 
end; 
else if not first.cpn and not last.cpn then do; 
    flag = 'none'; 
    concat = trim(('{"mpc" : "'||compress(mpc)||'" , '||'"contract_start_date" : "'||compress(contract_start_date)||'" '||' , "contract_end_date" : "'||compress(contract_end_date)||'"'||' , "subscription_status_code" : "'||compress(subscription_status_code)||'"'||' , '||'"promo_code" : "'||compress(promo_code)||'" '||' , "print_or_digi_flag" : "'||compress(print_or_digi_flag)||'"'||' , "payment_method_selection" : "'||compress(payment_method_selection)||'"'||', "subscription_type_code" : "'||compress(subscription_type_code)||'"'||' , "report_trial_subscription" : "'||compress(report_trial_subscription)||'"'||' , "product_desc" : "'||compress(product_desc)||'"} , ')); 
end; 
if first.cpn then json_array = trim(concat); 
    else json_array = trim(json_array)||trim(concat); 
run; 

例えば、CPN 4つのレコード、 があるとjson_arrayの長さは、3番目のレコードに955に達し、場合 - これは値がトリミングされる場合であり、そのそのcpnのjson_arrayの最終結果です。 json_array & concatの両方が10,000ポジションに設定されています。 なぜトリムされていますか?

ありがとうございます。 TRIM(上のSASドキュメントから

+0

トリミング済みですか?それとも、それを追加するためにCONCATに何も入れられていないので、ただ成長を止めますか? – Tom

+0

トリミングされました。最後の値(連結されたもの)は変数json_arrayにある – user2518751

+1

CONCATとJSON_ARRAYの長さはどこに設定されていますか?あなたが投稿したコードにはありません。また、それらにフォーマットを添付するか、どちらかを行いますか?長さ$ 10000のJSON_ARRAYを定義する場合は、$ 955という形式を付けます。その値を見る通常の試みは、それが切り捨てられたように見えます。 – Tom

答えて

3

)(https://support.sas.com/documentation/cdl/en/lefunctionsref/67960/HTML/default/viewer.htm#n1io938ofitwnzn18e1hzel3u9ut.htm

DATAステップでTRIM関数は、以前に長さが指定されていない変数に値を返した場合、その変数は、長さが与えられます議論の

JSON_ARRAYのサイズが明示的に設定されていない場合は、長さはCONCATになります。長さをCONCATに設定しないと、最初に割り当てられた長さになります(この場合は955)。

のでFORMAT、またはLENGTHステートメントを追加し、JSON_ARRAYを設定します(あなたもCONCATを行う必要があります)、あなたが行くように良いことがあります。

+0

それは私にとって初めてのことでした。ありがとう@DomPazz! – user2518751

関連する問題