Импорт данных в SAS из текстового файла с несколькими разделителями и переносами строк в символьных переменных - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу прочитать в SAS набор данных текстового файла, который использует два разных разделителя, "|"и строка "[конец текста]".Это устроено следующим образом:

var1|var2|var3
4657|366|text that 
has some line 
breaks [end text]
45|264| more text that has
line breaks [end text]

Я пытаюсь выяснить, как распознать оба этих двух разделителя.Я пытался использовать опцию DLMSTR, но это не сработало:

data new ;
  infile 'file.txt' dlmstr='|'||'[report_end]'  DSD firstobs=2 ;
  input var1 var2 var3 $;
run;

Можно ли использовать эти два разделителя одновременно?Или я использую неправильный стиль ввода для импорта моих данных?

1 Ответ

0 голосов
/ 11 декабря 2018

SAS может читать файлы с разделителями, у которых есть встроенные разрывы строк, если во встроенных разрывах строк используются символы, отличные от нормального конца строки.Поэтому, если ваши настоящие наблюдения заканчиваются CRLF (обычно для текстового файла Windows), а встроенные разрывы строк представляют собой просто один символ LF, тогда эти дополнительные разрывы будут рассматриваться как просто еще один символ в этом поле.

var1|var2|var3<CR><LF>
4657|366|text that<LF> 
has some line<LF>
breaks [end text]<CR><LF>
45|264| more text that has<LF>
line breaks [end text]<CR><LF>

Например, вот шаг данных, который может преобразовать ваш исходный файл.

data _null_;
  infile original lrecl=32767 ;
  file copy lrecl=1000000 termstr=lf ;
  input ;
  _infile_ = tranwrd(_infile_,'[end text]','0d'x);
  if _n_=1 then _infile_=trim(_infile_)||'0d'x;
  len = length(_infile_);
  put _infile_ $varying32767. len  ;
run;

Но может быть лучше заменить встроенные разрывы строк на другие символы, например ^, вместо.

data _null_;
  infile original truncover ;
  file copy lrecl=1000000 ;
  input line $char32767.;
  len = length(line);
  put line $varying32767. len @;
  if _n_=1 or index(_infile_,'[end text]') then put ;
  else put '^' @;
run;

Результат:

var1|var2|var3
4657|366|text that^has some line^breaks [end text]
45|264| more text that has^line breaks [end text]

Который легко читается.

Obs    var1    var2                      var3

 1     4657    366     text that^has some line^breaks [end text]
 2     45      264     more text that has^line breaks [end text]
...