Экспорт SAS CSV содержит нежелательную начальную запятую в каждой строке

Я новичок в SAS и изо всех сил пытаюсь экспортировать данные в CSV. Мой код успешно экспортирует файл, но в каждой строке, не являющейся заголовком, есть запятая, которая создает смещение.

Я чувствую, что мне не хватает чего-то очевидного, и мне действительно нужна помощь. Спасибо!

data _null_;
file "/export.csv";
set "/table" (keep= field1 field2 'field 3'n);
if _n_ = 1 then 
    do;       /* write header row */
        put "field1" 
            ',' 
            "field2"
            ','
            "field3";
    end;
    do;
        put (_all_) (','); 
    end;
run;

Мой вывод в конечном итоге выглядит так...

поле1, поле2, поле3,

х, у, г

, а , б , в

д, д, ф...

или

Поле1 Поле2 Поле3 Икс у г а б с г е ф

Проверьте опцию оператора DSD FILE.

data _null_ 15.02.2023 22:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
50
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вместо этого используйте proc export. Это сэкономит вам много времени и усилий по сравнению с кодированием ручного экспорта .csv.

proc export 
    data = table(keep=field1 field2 field3)
    file = '/export.csv'
    dbms = csv
    replace;
run;

Спасибо! Это простой способ экспорта. Я буду использовать этот метод, когда переименование столбцов не является проблемой (что не было ясно из моего сообщения).

user3525534 16.02.2023 00:03

Вы также можете переименовывать столбцы перед экспортом, используя параметры набора данных. proc export data=foo(rename=(field1=new_name1 field2=new_name2)) ...

Stu Sztukowski 16.02.2023 01:04

Спасибо за продолжение! Это полезно.

user3525534 16.02.2023 01:53

Общая версия, использующая мою вторую любимую процедуру CALL.

data _null_;
   file log ls=256 dsd; /*change LOG to your file*/
   set sashelp.heart;
   if _n_ eq 1 then link names;
   put (_all_)(:);
   return;
names:
   length _name_ $32;
   do while(1);
      call vnext(_name_);
      if _name_ eq '_name_' then leave;
      put _name_ @;
      end;
   put;
   return;
   run;

Спасибо! проверяет имя пользователя... да, проверяет.

user3525534 16.02.2023 00:05
Ответ принят как подходящий

Поскольку вы, кажется, уже знаете имена переменных (поскольку вы жестко закодировали строку заголовка), просто измените оператор PUT, чтобы не вставлять лишнюю запятую.

put field1 (field2 'field 3'n) (',');

Но на самом деле вам следует просто сообщить SAS, что вы пишете файл с разделителями, используя опцию DSD.

/* write header row */
data _null_;
  file "/export.csv";
  put "field1,field2,field 3";
run;


/* Add the actual data */
data _null_;
  file "/export.csv" dsd mod ;
  set table;
  put field1 field2 'field 3'n ;
run;

Если вы на самом деле не знаете имена переменных заранее, просто попросите SAS сгенерировать их для вас.

/* write header row */
proc transpose data=table(obs=0) out=names;
  var _all_;
run;
data _null_;
  file "/export.csv" dsd;
  set names;
  put _name_ @;
run;

/* Add the actual data */
data _null_;
  file "/export.csv" dsd mod ;
  set table ;
  put (_all_) (+0);
run;

Спасибо за подробный ответ. Этот метод обеспечивает наибольшую гибкость для моих нужд.

user3525534 16.02.2023 00:04

Тем временем у меня был метод Magoo'd, который тоже работает, но все это хорошие ответы.

Я использовал опцию оператора файла dsd.

data _null_;
file "/export.csv"; dsd delimiter = ",";
set "/table" (keep= field1 field2 'field 3'n);
if _n_ = 1 then 
    do;       /* write header row */
        put "field1" 
            ',' 
            "field2"
            ','
            "field3";
    end;
    do;
        put (_all_) (+0); 
    end;
run;

Еще один вариант, который работает при переименовании столбцов.

  • CSV-файл ODS
  • LABELS для печати меток вместо имен переменных, что позволяет переименовывать. Также поддерживает изменение/применение форматов при экспорте.
ods csv file='/home/fkhurshed/demo.csv';

proc print data=sashelp.class label noobs;
label age= 'Age (years)' sex = 'Sex' weight = 'Weight (lbs)' height = 'Height (inches)';
run;

ods csv close; 

Другие вопросы по теме