Чтение текстового файла с разделителями с пустым столбцом - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь прочитать текстовый файл с разделителями канала в SAS со следующим кодом:

Data MyData;
Infile MyFile Dsd Dlm= '|' Firstobs= 2 Termstr = CRLF Truncover;
Input A: $30.
  B: 2.
  C: $30.
  D: $30.
  E: 2.;
Run;

Столбцы от A до C определенно присутствуют для каждой записи, но столбцы D и E могут присутствовать или не присутствовать.,Файл разделен таким образом, что между двумя входами есть канал, но не после конца строки.

Пример показан ниже.

 A1|4|C1|D1|5A2|7|C2A3|3|C3|D3|1A4 ...

Как мне прочитать этот файл, где два последних ввода являются необязательными?Я не хочу использовать Proc Import, потому что это большой файл, а столбцы A, B и C имеют диапазон значений, которые Proc Import не может обработать очень хорошо (по моему опыту).

Мой текущий код приводит к тому, что некоторые значения из столбца A переносятся в столбец D, если отсутствуют значения.

1 Ответ

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

Обычно, есть некоторые признаки того, когда E заканчивается.Какой-то персонаж EOL (возможно, тот, которого вы не видите).Если это так, то вы можете использовать это как разделитель.

Если нет способа определить, когда заканчивается E, тогда вам нужно будет выяснить это из бизнес-логики (какое значение существует в E и в A).Если E всего 2, то вы можете обработать поле с помощью переменной _INFILE_.Примерно так может работать, если общая длина строки <= 32767: </p>

data want;
  infile 'h:\test.txt' dlm='|'; *infile with dlm statement as usual;
  input @@;                     *open input pointer;
  call scan(_infile_,5*_N_,pos,len,'|',); *find where the 5Nth field is;
  _infile_ = cat(substr(_infile_,1,pos+1),'|',substr(_infile_,pos+2));
                                *Insert a | there;
  input a: $30.
        b: 11.
        c: $5.
        d: $5.
        e: 2.
        @@
        ;                       *note the @@ holding the input pointer;
run;
...