SAS格式字符

时间:2018-02-22 13:17:30

标签: sas char format

首先我创建了这个表

data rmlib.tableXML;

input XMLCol1 $ 1-10 XMLCol2 $ 11-20 XMLCol3 $ 21-30 XMLCol4 $ 31-40 XMLCol5 $ 41-50 XMLCol6 $ 51-60;
datalines;
| AAAAA A||AABAAAAA||  BAAAAA||  AAAAAA||AAAAAAA ||AAAA |
; 
run;

我想清理,连接和导出。我写了以下代码

data rmlib.tableXML_LARGO;
file CleanXML lrecl=90000;
set rmlib.tableXML;
array XMLCol{6} ;
array bits{6};
array sqlvars{6};
    do i = 1 to 6;
        *bits{i}=%largo(XMLCol{i})-2;
        %let bits =input(%largo(XMLCol{i})-2,comma16.5);

        sqlvars{i} = substr(XMLCol{i},2,&bits.);


          put sqlvars{i} &char10.. @;
    end;



run;

宏观长度计算我有多少个字符

%macro largo(num);
length(put(&num.,32500.))
%mend;

我需要的是没有char10,我希望这个数字(10)是每个字符串的长度,所以要有类似的东西

 put sqlvars{i} &char&bits.. @;

我不知道是否可能,但我无法做到。 我希望看到像

这样的东西
 AAAAA AAABAAAAA  BAAAAA  AAAAAAAAAAAAA AAAA 

保留空格对我来说很重要(这只是xml提取的摘录的一个例子)。另外我会改变(例如)" B"对于" XPM",所以清理文本后大小会改变,这就是我需要在char中灵活的

感谢您的时间

Julen

3 个答案:

答案 0 :(得分:0)

我仍然不太确定你想要实现什么,但是如果你想将来自多个varriable的文本组合成一个变量,那么你可以做一些事情:

proc sql; 
   select name into :names separated by '||' 
   from dictionary.columns 
   where 1=1 
      and upcase(libname)='YOURLIBNAME'
      and upcase(memname)='YOURTABLENAME';
quit;

data work.testing;
   length resultvar $ 32000;
   set YOURLIBNAME.YOURTABLENAME;
   resultvar = &names;
   resultvar2 = compress(resultvar,'|');
run;

无法对此进行测试,但如果您将YOURLIBNAME和YOURTABLENAME替换为各自的表格,则此功能应该可以使用。我不是100%确定压缩是否会保留文本中的空格..但我认为它应该。

答案 1 :(得分:0)

格式$VARYING. <length-variable>是解决此输出问题的理想选择。

假设有一些变量的值是垂直条有界的,并且想要输出到文件中的值没有边界条的值的连接。

data have;
  file "c:\temp\want.txt" lrecl=9000;

  length xmlcol1-xmlcol6 $100;
  array values xmlcol1-xmlcol6 ;

  xmlcol1 = '|  A |';
  xmlcol2 = '|A BB|';
  xmlcol3 = '|A BB|';
  xmlcol4 = '|A BBXC|';
  xmlcol5 = '|DD   |';
  xmlcol6 = '| ZZZ |';

  do index = 1 to dim(values);
    value = substr(values[index], 2); * ignore presumed opening vertical bar;
    value_length = length(value)-1; * length with still presumed closing vertical bar excluded;
    put value $varying. value_length @; * send to file the value excluding the presumed closing vertical bar;
  end;
run;

答案 2 :(得分:0)

你有一些编码错误,这使得你很难理解你想做什么。

您的32500.宏没有任何意义。没有格式$32500.。它会在您的代码中运行的唯一原因是您尝试将格式应用于字符变量而不是数字。因此SAS会自动转换为使用%LET

您在数据步骤中隐藏的%largo()语句将在数据步骤运行之前执行。因此,在数据步骤之前移动它会更加困惑。

因此,将调用替换为%let bits =input(length(put(XMLCol{i},32500.))-2,comma16.5); 您的宏变量BITS将包含此文本。

sqlvars{i} = substr(XMLCol{i},2,input(length(put(XMLCol{i},$32500.))-2,comma16.5));

然后在一行代码中使用。这条线最终将成为这个SAS代码。

sqlvars{i} = substr(XMLCol{i},2,length(XMLCol{i})-2);

在我看来,这是一个非常迂回的方式:

sqllen{i} = length(XMLCol{i})-2;
sqlvars{i} = substr(XMLCol{i},2,sqllen{i});

由于SAS将字符变量存储为固定长度,因此它将填充存储的值。所以你需要做的是记住长度,以便以后在写出值时使用它。所以也许您应该创建另一个数值变量数组,您可以在其中存储长度。

<?php
  if(isset($_POST['submit'])) {
    $code = $_POST['code'];

if($code == '7613') {
    echo " it worked! ";
} else {
    echo "it did not work !";
   }
}

?>

<form action="login.php" method="post">
    <input type="password" name="code"  maxlength="4" />
    <input type="submit" name="submit" value="Submit" />

</form>