Использование Input правильно с даталинами - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно определить правильный оператор ввода для чтения данных из линий данных.

Пробные указатели и позиционные значения

data oscar;
    input @1 oscardate $ @9 oscaryear @14 budget dollar11. gross dollar13. 
        +1 title $16. +1 asofdate mmddyy10. +1 rating 3.1;
    format asofdate mmddyy10. budget dollar12. gross dollar13.;
    datalines;
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000 The Departed 02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061 Crash 02/26/2012 8.0
;
run;

Я хочу иметь возможность распечатывать значениякак написано в строках данных

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Ваши текущие строки не отформатированы таким образом, чтобы их можно было проанализировать.Это потому, что они используют пробел для разделения между полями, но поле TITLE также включает пробелы.Существует несколько способов исправить данные, чтобы их можно было проанализировать.

Вы можете преобразовать строки, чтобы использовать другой разделитель, который не отображается ни в одном поле.Символ трубы полезен.Вкладка ('09'x) также распространена.

27Feb11|2011|$15,000,000|$373,700,000|The Kings Speech|02/26/2012|8.2

Вы можете добавить кавычки вокруг любого значения, которое содержит разделитель (или кавычки).

27Feb11 2011 $15,000,000 $373,700,000 "The Kings Speech" 02/26/2012 8.2

Вы можете использовать фиксированную длинуfields.

27Feb11 2011    $15,000,000 $373,700,000  The Kings Speech        02/26/2012 8.2
07Mar10 2010    $11,000,000  $12,647,089  The Hurt Locker         02/26/2012 7.2
22Feb09 2009    $15,000,000 $141,319,195  Slumdog Millionaire     02/26/2012 8.2
24Feb08 2008    $25,000,000  $74,273,505  No Country for Old Men  02/26/2012 8.2

Если, как и в этом случае, только одно поле может содержать разделитель в конце строки.

27Feb11 2011 $15,000,000 $373,700,000 02/26/2012 8.2 The Kings Speech

Для SAS вы также можете просто убедиться, чтоВаше значение TITLE не содержит несколько пробелов рядом друг с другом, а затем убедитесь, что после заголовка есть как минимум два пробела.Тогда модификатор & в операторе INPUT скажет SAS разрешить пробелы в значении, но прекратит чтение этого поля, когда оно увидит два соседних пробела.

27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech  02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker  02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire  02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men  02/26/2012 8.2

Если вы не можете исправить строки ввода и только одно поле имеет встроенные пробелы, тогда вы можете проанализировать строку в вашем коде.Поэтому для этого я бы просто прочитал последние три поля в значение TITLE, а затем вытащил дату и рейтинг и удалил их.

data oscar;
  infile datalines truncover;
  length oscardate 8 oscaryear 8 budget 8  gross 8 title $50 asofdate 8 rating 8;
  informat oscardate date. budget gross dollar. asofdate mmddyy. ;
  format oscardate asofdate yymmdd10. budget gross dollar12. rating 4.1 ;
  input oscardate -- gross title $50. ;
  rating = input(scan(title,-1,' '),32.);
  asofdate = input(scan(title,-2,' '),mmddyy10.);
  title = substrn(title,1,length(title)-length(scan(title,-1,' '))-length(scan(title,-2,' '))-2);
datalines;
27Feb11 2011 $15,000,000 $373,700,000 The Kings Speech 02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089 The Hurt Locker 02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195 Slumdog Millionaire 02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505 No Country for Old Men 02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000 The Departed 02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061 Crash 02/26/2012 8.0
;

Если вы хотите записать новую версию данных в виде текстаэто можно проанализировать, используя опцию DSD в операторе FILE и простой оператор put.

339  data _null_;
340   set oscar;
341   file log dsd dlm=' ' ;
342   put oscardate -- rating ;
343  run;

2011-02-27 2011 $15,000,000 $373,700,000 "The Kings Speech" 2012-02-26 8.2
2010-03-07 2010 $11,000,000 $12,647,089 "The Hurt Locker" 2012-02-26 7.2
2009-02-22 2009 $15,000,000 $141,319,195 "Slumdog Millionaire" 2012-02-26 8.2
2008-02-24 2008 $25,000,000 $74,273,505 "No Country for Old Men" 2012-02-26 8.2
2007-02-25 2007 $90,000,000 $289,800,000 "The Departed" 2012-02-26 8.5
2006-03-05 2006 $6,500,000 $98,410,061 Crash 2012-02-26 8.0
0 голосов
/ 02 февраля 2019

Используйте оператор attrib, чтобы объявить и указать атрибуты вводимых переменных.Код будет более понятным (для людей), чем наличие небольшого количества других атрибутов, влияющих на операторы и, возможно, неявного определения из оператора input.

Когда данные имеют символьное значение с несколькими внутренними единичными пробелами, выследует либо сместить значение от других, используя два пробела (и использовать & модификатор ввода), либо заключить в кавычки значение данных (и использовать infile cards dsd dlm=" ").

Например, заголовок ограничен двумя пробелами:

data oscar;
  attrib
    oscardate format=date9. informat=date9.
    oscaryear format=4.
    budget    format=dollar13.0 informat=dollar13.0
    gross     format=dollar13.0 informat=dollar13.0
    title     length=$200
    asofdate  format=mmddyy10. informat=mmddyy10.
    rating    format=4.1
  ;

  input oscardate oscaryear budget gross & title & asofdate rating;
datalines;
27Feb11 2011 $15,000,000 $373,700,000  The Kings Speech  02/26/2012 8.2
07Mar10 2010 $11,000,000 $12,647,089  The Hurt Locker  02/26/2012 7.2
22Feb09 2009 $15,000,000 $141,319,195  Slumdog Millionaire  02/26/2012 8.2
24Feb08 2008 $25,000,000 $74,273,505  No Country for Old Men  02/26/2012 8.2
25Feb07 2007 $90,000,000 $289,800,000  The Departed  02/26/2012 8.5
05Mar06 2006 $6,500,000 $98,410,061  Crash  02/26/2012 8.0
run;

В случае особенно пагубных строк данных вам может понадобиться input;, чтобы заполнить автоматическую переменную _infile_ всей строкой, а затем использовать сопоставление с шаблоном регулярного выражения Perl, чтобы извлечь желаемыйparts.

Другие конструкции строк данных гарантировали бы, что все поля данных выровнены по столбцам, и в этом случае модификатор @ может использоваться для чтения значения, начинающегося с определенного столбца..

input имеет так много функций, что нет лучшего способа или единого правильного государственного деятеля.т.

...