Ваши текущие строки не отформатированы таким образом, чтобы их можно было проанализировать.Это потому, что они используют пробел для разделения между полями, но поле 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