2016-07-11 4 views
1

Я пытаюсь написать json-файл с шага данных.Как избежать пробелов в помете в SAS

но мои операторы put всегда добавляют ненужные пробелы после переменных.

put '   {"year":' year ','; 

создаст {"year":2013 ,

и

put ' {"name":"' %trim(name) '", ' ; 

создаст {"name":"Rubella virus ",

Как я могу удалить пробел после "краснухой вирус" без усложнять вещи?


Мой лучшее решение до сих пор создать переменную, которая использует cats и затем положить новаяПеременная немного, как это:

newvar=cats('{"name":"',name,'",'); 
put newvar; 

Спасибо!

+0

пытаются использовать функцию полосы вместо отделки –

+1

@andrey_sz это не имеет ничего общего с белым пространством переменной, но это свойство функции пут. Он всегда вызывает одно пустое пространство после переменной. Он должен быть отодвинут на один пробел, используя (+) - 1. См. Мой подзаголовок ниже. –

ответ

4

Вам нужно переместить указатель назад на один шаг. Вы делаете это, прося идти вперед минус один шаг. Используйте это:

put '{"name": "' name (+) - 1 '",';

Странно, я знаю, но он работает.

Вот пример с sashelp.class:

Код:

data _null_; 
    set sashelp.class end = eof; 

    if _N_ eq 1 then 
     put '['; 
    put '{ "Name":"' Name+(-1) 
     '","Sex":"' Sex+(-1) 
     '","Age":"' Age+(-1) 
     '","Height":"' Height+(-1) 
     '","Weight":"' Weight+(-1) 
     '"}'; 

    if eof then 
     put ']'; 
    else put ','; 
run; 

Результат:

[ 
    { "Name":"Alfred","Sex":"M","Age":"14","Height":"69","Weight":"112.5"} 
    , 
    { "Name":"Alice","Sex":"F","Age":"13","Height":"56.5","Weight":"84"} 
    , 
    { "Name":"Barbara","Sex":"F","Age":"13","Height":"65.3","Weight":"98"} 
    , 
    { "Name":"Carol","Sex":"F","Age":"14","Height":"62.8","Weight":"102.5"} 
    , 
    { "Name":"Henry","Sex":"M","Age":"14","Height":"63.5","Weight":"102.5"} 
    , 
    { "Name":"James","Sex":"M","Age":"12","Height":"57.3","Weight":"83"} 
    , 
    { "Name":"Jane","Sex":"F","Age":"12","Height":"59.8","Weight":"84.5"} 
    , 
    { "Name":"Janet","Sex":"F","Age":"15","Height":"62.5","Weight":"112.5"} 
    , 
    { "Name":"Jeffrey","Sex":"M","Age":"13","Height":"62.5","Weight":"84"} 
    , 
    { "Name":"John","Sex":"M","Age":"12","Height":"59","Weight":"99.5"} 
    , 
    { "Name":"Joyce","Sex":"F","Age":"11","Height":"51.3","Weight":"50.5"} 
    , 
    { "Name":"Judy","Sex":"F","Age":"14","Height":"64.3","Weight":"90"} 
    , 
    { "Name":"Louise","Sex":"F","Age":"12","Height":"56.3","Weight":"77"} 
    , 
    { "Name":"Mary","Sex":"F","Age":"15","Height":"66.5","Weight":"112"} 
    , 
    { "Name":"Philip","Sex":"M","Age":"16","Height":"72","Weight":"150"} 
    , 
    { "Name":"Robert","Sex":"M","Age":"12","Height":"64.8","Weight":"128"} 
    , 
    { "Name":"Ronald","Sex":"M","Age":"15","Height":"67","Weight":"133"} 
    , 
    { "Name":"Thomas","Sex":"M","Age":"11","Height":"57.5","Weight":"85"} 
    , 
    { "Name":"William","Sex":"M","Age":"15","Height":"66.5","Weight":"112"} 
    ] 

С уважением, Vasilij

+0

Я получаю эту ошибку: 'ERROR 22-322: ошибка синтаксиса, ожидающая одно из следующего: имя, arrayname, _ALL_, _CHARACTER_, _CHAR_, _NUMERIC_.' –

+0

@ooo У меня нет проблемы. Я буду расширять свой asnwer на примере sashelp.class. Может быть, это поможет. –

+0

Ваш расширенный пример отлично работает. Благодаря ! –

1

Если вы хотите иметь «очиститель ', вы могли бы создать себе вспомогательную функцию или две, используя proc fcmp. Эта функция примет описание строки, имя поля, которое вы хотите, и затем укажите, следует ли указывать возвращаемую строку. Обратите внимание, что если значения могут содержать кавычки, вы можете использовать функцию quote() вместо т

Пример Функция:

proc fcmp outlib=work.funcs.funcs; 

    function json(iName $, iField $, iQuote) $;  
    length result $200; 
    quote_char = ifc(iQuote,'"',''); 
    result = cats('"', iName, '":',quote_char, iField, quote_char); 
    return (result); 
    endsub; 

run; 

Пример:

data _null_; 
    set sashelp.class; 
    x = catx(',', 
      json("name",name,1), 
      json("age",age,0)); 
    put x; 
run; 

Пример Выход:

"name":"Alfred","age":14 
"name":"Alice","age":13 
"name":"Barbara","age":13 
"name":"Carol","age":14 
"name":"Henry","age":14 
"name":"James","age":12 
"name":"Jane","age":12 
2

Для полей символов вы можете использовать формат $QUOTE. для добавления котировок. Используйте :, чтобы удалить конечные пробелы в значении переменной.

put '{ "Name":' Name :$quote. 
    ',"Sex":' Sex :$quote. 
    ',"Age":"' Age +(-1) '"' 
    ',"Height":"' Height +(-1) '"' 
    ',"Weight":"' Weight +(-1) '"' 
    '}' 
; 
+0

Nice - я не знал ни о формате '$ quote.', ни о модификаторе': '... –

Смежные вопросы