3

「|」を使用する.txtファイルをSASに読み込んでいます 区切り文字として。問題は、「|」を使用している列が 1 つあることです。区切り記号のように機能するのではなく、単語の区切り記号としても使用できます。これは 1 つの列に配置する必要があります。

たとえば、txt ファイルは次のようになります。

apple|fruit|Healthy|choices|of|food|12|2012|chart

SAS データセットでは次のようにする必要があります。

apple | fruit | Healthy choices of Food | 12 | 2012 | chart

「|」を削除するにはどうすればよいですか 「健康的な食品の選択」の間?

4

4 に答える 4

2

私はこれがあなたが望むことをすると思います:

data tmp1;
  length tmp $100;
  input tmp $;
  cards;
apple|fruit|Healthy|choices|of|food|12|2012|chart
apple|fruit|Healthy|choices|of|food|and|lots|of|other|stuff|12|2012|chart
;
run;

data tmp2;
  set tmp1;
  num_delims=length(tmp)-length(compress(tmp,"|"));
  expected_delims=5;
  extra_delims=num_delims-expected_delims;
  length new_var $100;
  i=1;
  do while(scan(tmp,i,"|") ne "");
    if i<=2 or (extra_delims+2)<i<=num_delims then new_var=trim(new_var)||scan(tmp,i,"|")||"|";
    else new_var=trim(new_var)||scan(tmp,i,"|")||"#";
    i+1;
  end;
  new_var=left(tranwrd(new_var,"#"," "));
run;
于 2012-11-15T12:22:54.757 に答える
0

これは特にエレガントではありませんが、うまくいきます:

data tmp;
 input tmp $50.;
 cards;
apple|fruit|Healthy|choices|of|food|12|2012|chart
;
run;

data tmp;
 set tmp;
 var1 = scan(tmp,1,'|');
 var2 = scan(tmp,2,'|');
 var4 = scan(tmp,-3,'|');
 var5 = scan(tmp,-2,'|');
 var6 = scan(tmp,-1,'|');

 var3 = tranwrd(tmp,trim(var1)||"|"||trim(var2),"");
 var3 = tranwrd(var3,trim(var4)||"|"||trim(var5)||"|"||trim(var6),"");
 var3 = tranwrd(var3,"|"," ");
 run;
于 2012-11-15T02:05:21.563 に答える
0

Itzy's answer を少し拡張すると、別の可能な解決策があります。

data want;
   /* Define variables */
   attrib item    length=$10 label='Item';
   attrib class   length=$10 label='Family';
   attrib desc    length=$80 label='Item Description';
   attrib count   length=8   label='Some number';
   attrib year    length=$4  label='Year';
   attrib somevar length=$10 label='Some variable';

   length countc $8; /* A temp variable */

   infile 'c:\temp\delimited_temp.txt' lrecl=1000 truncover;
   input;
   item    = scan(_infile_,1,'|','mo');
   class   = scan(_infile_,2,'|','mo');
   countc  = scan(_infile_,-3,'|','mo');  /* Temp var for numeric field */
   count   = inputn(countc,'8.');         /* Re-read the numeric field */
   year    = scan(_infile_,-2,'|','mo');
   somevar = scan(_infile_,-1,'|','mo');

   desc = tranwrd(
             substr(_infile_
                 ,length(item)+length(class)+3
                 ,length(_infile_) 
                    - ( length(item)+length(class)+length(countc)
                       +length(year)+length(somevar)+5))
            ,'|',' ');
   drop countc;
run;

この場合の鍵は、ファイルを直接読み取り、区切り文字を自分で処理することです。これは扱いにくい場合があり、データ ファイルが説明どおりである必要があります。より良い解決策は、このデータを提供した人に戻って、より適切な形式で提供するよう依頼することです。幸運を!

于 2012-11-15T16:11:16.100 に答える
0

別の可能な回避策。

data tmp;
infile '/path/to/textfile'; 
input tmp :$100.;
array varlst (*) $30 v1-v6;
a=countw(tmp,'|');
do i=1 to dim(varlst);
 if i<=2 then
   varlst(i) = scan(tmp,i,'|');
 else if i>=4 then
   varlst(i) = scan(tmp,a-(dim(varlst)-i),'|');
 else do j=3 to a-(dim(varlst)-i)-1;
   varlst(i)=catx(' ', varlst(i),scan(tmp,j,'|'));
   end;
 end;
drop tmp a i j; 
run;
于 2012-11-15T17:14:41.630 に答える