Ввод SAS: целые числа, разделенные запятыми - PullRequest
0 голосов
/ 20 сентября 2019

Это кажется невероятно простым, но я просто не могу найти нужную информацию в SAS для чтения в виде данных, которые у меня есть, которые выглядят так:

9  Bittersweet                 #FD7C6E  (253, 124, 110)  48 1949
10  Black                      #000000  (0,0,0)          8 1903

Мне нужно прочитать взначения в круглых скобках в виде трех отдельных числовых переменных, и я не могу найти информацию, которая просто «читает числовые символы, пока не встретит нечисловые символы».Файл не полностью разделен запятыми, тем более жаль, что (кто бы ни "проектировал" этот формат файла, он должен быть застрелен, мертв, похоронен, воскрешен и снова застрелен!) Проблема с данными в скобках заключается в том, что иногда после пробелазапятая, а иногда нет.Я получил первое число и первый набор символов после числа, считанного с помощью ввода в столбце, поскольку # всегда находится в столбце 32. Я прочитал шестнадцатеричное шестнадцатеричное значение (просто с использованием символа там),

Вот мой MWE:

Data crayons;
    Infile 'path\crayons.dat' MISSOVER;
    Input crayon_number
          color_name $ 4-31
          hex_code   $ 33-38 @42
          red   3. @','
          green 3. @','
          blue  3. @')'
          pack_size
          year_issued
          year_retired;
Run;

Строка Bittersweet прочитана правильно, но не строка Black.(year_retired пусто для обоих из них - меня это не касается.) В строке Black я правильно получаю переменную hex_code, но ничего после этого.

Поэтому я предполагаю, что главный вопрос заключается в следующем: как мне прочитать целое число переменной длины, которое гарантированно содержит НЕ с запятой, особенно если за ней сразу следует запятая?

Возможно, на более высоком уровне: где я могу найти подобные вещи?У меня есть эти вопросы о чтении в грязных данных, и я не знаю, куда идти, чтобы узнать.По моему опыту, SAS Language Reference совершенно не подходит для этого.Если данные помещаются в их аккуратные маленькие коробочки, вы можете идти.Что-нибудь вне этого, и их ссылка бесполезна.

Большое спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Я бы использовал ввод списка с разделителями = '(,)'

Data crayons;
   infile cards dlm=' (,)' missover;
   Input crayon_number
          color_name &$28.
          hex_code $   
          red   
          green 
          blue  
          pack_size
          year_issued
          year_retired;
   list;
   cards;
9  Bittersweet                 #FD7C6E  (253, 124, 110)  48 1949
10  Black                      #000000  (0,0,0)          8 1903
0 голосов
/ 20 сентября 2019

Другой вариант - прочитать его как символ как целое поле и позже использовать SCAN ().

Поскольку вы упоминаете, что позиция фиксирована, звучит так, будто вы читаете фиксированную ширину.Тип файла?

red = scan(orig_var, 1, "(,)");
green = scan(orig_var, 2, "(,)");
blue = scan(orig_var, 3, "(,)");
...