SAS原始数据读取线指针,具有不一致的行和嵌入的标头

时间:2015-01-28 01:56:21

标签: file-io sas

我想要阅读的原始数据不仅跨越几条不同的行,而且每条记录的行数也不相同。为了使事情进一步复杂化,它还会在每个破坏所有内容的页面之后出现在文件中间的标题。

 Time: 1:47pm                                      Item Master Report For 06/06/2013                                 Report: GMRIMMSB

Item Type: Nonstock

Item  Asset  Inven  Dsp   ---Order---  ---Primary----                           Substute     Contract     Hazd   Count     
Stat  Class  Class  Unt   Unit   Conv   Loc    Vendor        Manufacturer Nbr   Item Nbr      Number      Flag   Cycle  
------------------------------------------------------------------------------------------------------------------------------------
  ITEM     20049 TEST PNEUMONIA S LATEX ZL22 (30859001)
 A    0173    6      PK     PK       1   NSL   2431       R30859001                                                     
     Vendor  1:      2431 FISHER SCIENTIFIC COMPANY                 2:      2658 REMEL
             3:       536 ABBOTT LABS - DIAGNOSTIC DIVISION         4:      1404 MUREX DIAGNOSTICS INC.

  ITEM     20051 ANTIGEN BACTER. WELLCOGEN ZL26 B1901-51
 A    0173    6      PK     PK       1   NSL   2431       30859602                                                      
     Vendor  1:      2431 FISHER SCIENTIFIC COMPANY                 2:      3804 CARDINAL HEALTH-ALLEGIANCE
             3:      2658 REMEL                                     4:       536 ABBOTT LABS - DIAGNOSTIC DIVISION
             5:      1404 MUREX DIAGNOSTICS INC.

  ITEM     20053 FILM DUPLICATING 10X12
 I    0173    14     BX     BX       1   NSX   1335       112010                                                        
     Vendor  1:      1335 AGFA CORPORATION

  ITEM     20055 FILM HTU 10 X 12
 I    0173    14     BX     BX       1   NSX   1335       094010                                                        
     Vendor  1:      1335 AGFA CORPORATION

  ITEM     20056 FILM HTU 8 X 10
 I    0173    14     BX     BX       1   NSX   1335       094008                                                        
     Vendor  1:      1335 AGFA CORPORATION

  ITEM     20057 SOL AXSYM FLUIDIES CHECK (09A3401)
 A    0173    119    BX     BX       1   NSL   536                                                                      
     Vendor  1:       536 ABBOTT LABS - DIAGNOSTIC DIVISION

  ITEM     20058 FILM DUPLICATING 8 X 10
 I    0173    14     BX     BX       1   NSX   1335       112008                                                        
     Vendor  1:      1335 AGFA CORPORATION

  ITEM     20059 FILM HTU 14 X 17
 I    0173    14     BX     BX       1   NSX   1335       094014                                                        
     Vendor  1:      1335 AGFA CORPORATION
Item  Asset  Inven  Dsp   ---Order---  ---Primary----                           Substute     Contract     Hazd   Count     
Stat  Class  Class  Unt   Unit   Conv   Loc    Vendor        Manufacturer Nbr   Item Nbr      Number      Flag   Cycle  
------------------------------------------------------------------------------------------------------------------------------------

  ITEM     20060 FILM HTU 30 X 35
 I    0173    14     BX     BX       1   NSX   1335       094030                                                        
     Vendor  1:      1335 AGFA CORPORATION

  ITEM     20061 FILM HTU 14 X 14
 I    0173    14     BX     BX       1   NSX   1335       094001                                                        
     Vendor  1:      1335 AGFA CORPORATION

以下是我使用的代码(在SAS工作室中)....

libname mylib '/folders/myfolders/';

data myfile;
    length itm $ 4 itemnum 5 itemdesc $ 40 inac $ 2 assetcl $ 4 invcl 3 dspunit $ 2
ordunit $ 2 convr 4 loc $ 4 vndnum 4 manufnum $ 20 vendinfo $ 80; 
    infile '/folders/myfolders/ItemstrSM.txt' missover;
    input #1 itm $ itemnum itemdesc $ &
          #2 inac $ assetcl $ invcl dspunit $ ordunit $ convr loc $ vndnum manufnum 
          #3 vendinfo & $ ; 
run;

proc print data=myfile noobs;
run;

3 个答案:

答案 0 :(得分:0)

如果您不需要经常处理大量此文件,则只需使用文本编辑器即可解决问题。

  1. 将页面头部替换为空白。
  2. 将'\ nITEM'替换为'### ITEM'
  3. 将'\ n'替换为空格
  4. 将'###'替换为'\ n'
  5. 现在,文本文件中每行有一个条目。

答案 1 :(得分:0)

您可以用来处理重复标题行的一种解决方法是在主输入语句之前使用以下内容:

input @;
if _infile_ = "Header row text" then delete;

这会将整行加载到_infile_而不填充任何变量并将其保存以供主输入语句处理(前提是它不是标题行)。

答案 2 :(得分:0)

假设您向我们展示了相同的格式,那么每个项目的持续时间不超过6个:

data test(drop=itm);
  length itm $4 itemnum 8 itemdesc $132
            inac $1 assetcl invcl 8 dspunit ordunit $2 convr 8 loc $3 vndnum 8 manufnum $132;
  infile "c:\users\c41928\documents\egreadin.txt" missover lrecl=32767 truncover;
  input itm $ @;
     if itm="ITEM" then 
      do;
        input itemnum itemdesc $ / 
                inac $ assetcl $ invcl dspunit $ ordunit $ convr loc $ vndnum manufnum /
                vendinfo1 $132.;
        if index(vendinfo1,"2:") then 
            input itm $ @;
            if itm="3:" then
            do;
              input @1 vendinfo2 $132.;
              input itm $ @;
              if  itm = "5:" then
                do;
                   input @1 vendinfo3 $132.; 
                   output;
                 end;
              else output;
            end; 
         else output;
       end;
    else delete;
run;

如果有一个未知的,可能是无限数量的供应商,那么itterative do循环将更合适。否则,如果已知数量的供应商高于6,则可以添加更多的do循环。

无论如何,它不是很漂亮但它有效。