[SAS]在一个数据步骤中读取具有多个级别的混合记录类型(.dat)

时间:2018-12-03 02:48:48

标签: sas

我有一个数据集(employeeinfo.dat)看起来像这样(请注意,观察到的不仅仅是这些):

(Level1) Chief Executive Officer  (Anthony Miller )                                                    $433,800
     (Level2) Chief Sales Officer  (Harry Highpoint )                                                  $243,190
              (Level3) Vice President  (Henri Le Bleu )                                                $194,885
                       (Level4) Director  (Reginald Steiber )                                          $156,065
                                (Level5) Sales Manager  (Dennis Lansberry )                             $84,260
                                         (Level6) Sales Rep. I  (Saunders Briggi )                      $26,335
                                (Level5) Senior Sales Manager  (Louis Favaron )                         $95,090
                                         (Level6) Sales Rep. I  (Harold Boulus )                        $26,035

我需要将其读入SAS,以便可以将数据分为以下变量:级别,职位,姓名和薪水。

我的问题是在整个数据中指示了不同的级别(没有设置模式)。意思是,我不能认为任何变量都始于要输入的数据中任何特定位置(列),也不能为大多数变量指定长度,因为它们会发生变化。

这是我微不足道的尝试(我至少正确地在第一个条目中加载了),只是为了确保我完全了解这个概念:

data emp;
    infile 'employeeinfo.dat';
    input @1 position $9.
          @10 jobtitle $24.
          @35 name $72.
          @108 salary dollar8.;
run;

这将正确加载第一个条目,但对于其余条目显然是无用的。

关于如何解决这个问题的任何想法?

注意:我在执行此操作时有一个约束。我正在使用的文本指出,本练习的目的是给与使用没有定界符的固定宽度原始数据文件的经验。该解决方案必须具有多个带有指针控件的输入语句。

1 个答案:

答案 0 :(得分:1)

职位和名字之间的差距总是至少两个空格,同样在名字和薪水之间也是如此。当输入字段之间有两个或多个空格时,列表 InsertDimensionRequest insertRow = new InsertDimensionRequest(); insertRow.Range = new DimensionRange() { SheetId = MySheetID, Dimension = "ROWS", StartIndex = 1, EndIndex = 2 }; PasteDataRequest data = new PasteDataRequest { Data = string.Join(",", values[0]), Delimiter = ",", Coordinate = new GridCoordinate { ColumnIndex = 0, RowIndex = 1, SheetId = MySheetID }, }; BatchUpdateSpreadsheetRequest r = new BatchUpdateSpreadsheetRequest() { Requests = new List<Request> { new Request{ InsertDimension = insertRow }, new Request{ PasteData = data } } }; BatchUpdateSpreadsheetResponse response1 = service.Spreadsheets.BatchUpdate(r, spreadsheetId).Execute(); 样式input参数使用两个空格作为值标记的结尾,因此将读取这些单词之间包含单个空格的字段值。 &上的:参数将扫描从下一个非空白到下一个空白或行尾的值。

salary

可以使用filename have 'c:\temp\sample.txt'; data want; attrib level length=$10 position length=$50 name length=$30 salary length=8 ; infile have missover; input level position& name& salary: dollar. ; ; run; 函数清除levelname值:

compress