2016-12-05 3 views
0

В настоящее время я пытаюсь импортировать файл CSV с zipped в SAS, и у меня есть 3 столбца с датами, записанными в формате YYYY-MM-DD. Все данные в этом csv-файле находятся в уникальных строках, поэтому я предполагаю, что это строка и не распознается как числа (извините, что я только начал кодирование в последнее время, и я все еще изучаю множество основ). Что происходит, так это то, что SAS принимает 8 символов, и он появляется с 2010-08 годами, в основном не хватает дня. Я пробовал несколько способов обойти это с помощью ввода, но до сих пор не решая его. Я либо получаю пустой столбец, либо номер с конверсионными номерами (например, 52789 - я думаю, что это с того момента, когда в 1960 году SAS использует ссылку) Надеюсь, вы, ребята, можете дать мне несколько советов, как это сделать. Код:SAS: Импорт CSV-файла с датами

FILENAME IPC3data zip 'C:\Users\********\IPC3data.zip' 
member='tls201_appln.csv'; 
DATA newdata; 
    INFILE IPC3data DLM=';' DSD FIRSTOBS=2; 
    INPUT appln_id $ appln_auth $ appln_nr $ appln_kind $ appln_filing_date $ appln_filing_year $ appln_nr_epodoc $ appln_nr_original $ ipr_type $ internat_appln_id $ int_phase $ reg_phase $ nat_phase $ earliest_filing_date $ earliest_filing_year $ earliest_filing_id $ earliest_publn_date $ earliest_publn_year $ earliest_pat_publn_id $ granted $ docdb_family_id $ inpadoc_family_id $ docdb_family_size $ nb_citing_docdb_fam $ nb_applicants $ nb_inventors; 
Filing_date = input(appln_filing_date, ANYDTDTE10.); 
put Filing_date=YYMMDD10.; 
Early_filing_date = input(earliest_filing_date, ANYDTDTE10.); 
put Early_filing_date=YYMMDD10.; 
Early_publn_date = input(earliest_publn_date, ANYDTDTE10.); 
put Early_publn_date=YYMMDD10.; 

RUN; Спасибо!

ответ

0

Определите свои переменные, тогда у вас не будет проблем с усечением.

Лично мне легче определить переменные сначала в том порядке, в котором я хочу их прочитать, используя оператор LENGTH. Вот тот, который эквивалентен тому, как SAS угадал, как определить свои переменные на основе вашего текущего оператора INPUT, но я изменил всю переменную даты ..._ на 10 символьных строк вместо 8 символов по умолчанию. Вероятно, вы также должны изменить длину (или даже тип) некоторых других переменных.

LENGTH appln_id appln_auth appln_nr appln_kind $8 appln_filing_date $10 
     appln_filing_year appln_nr_epodoc appln_nr_original $8 
     ipr_type internat_appln_id int_phase reg_phase nat_phase $8 
     earliest_filing_date $10 earliest_filing_year earliest_filing_id $8 
     earliest_publn_date $10 earliest_publn_year earliest_pat_publn_id $8 
     granted docdb_family_id inpadoc_family_id docdb_family_size $8 
     nb_citing_docdb_fam nb_applicants $8 
     nb_inventors 8 
; 

Тогда ВХОД утверждение может быть очень простым, потому что вы можете использовать позиционный список переменного, поставив -- между первыми и последними именами переменными.

input appln_id -- nb_inventors ; 

Но в действительности даты - это цифры в SAS. Вам просто нужно использовать специальные информационные форматы и форматы, чтобы SAS знал, как переводить с текстовых строк и на человекочитаемые текстовые строки. Поэтому измените переменные даты на цифры, изменив длину от $10 до 8 и приложите соответствующий информационный файл, и SAS сохранит их как даты вместо символьных строк.

informat appln_filing_date earliest_filing_date earliest_publn_date yymmdd.; 
format appln_filing_date earliest_filing_date earliest_publn_date yymmdd10.; 
+0

Уважаемый Том, спасибо за комментарий по длине - это решило проблему! U R right, мне также нужно больше 8 пробелов для некоторых столбцов идентификаторов. Трюк, который я знал, но не думал об этом ... однако, если я добавлю часть informat/format, он всегда дает мне сообщение об ошибке «Информационный файл $ yymmdd не найден или не может быть загружен». Не уверен, что мне еще нужно добавить это, учитывая, что оператор длины дал мне полные даты? – Annina

+0

Вы должны использовать информатив, соответствующий типу переменной.Поскольку ваша переменная была символом, SAS ищет информатив, который будет генерировать результат символа. Следовательно, дополнительный $ в сообщении об ошибке. Обязательно определите переменные как числа. – Tom

0

По умолчанию строки SAS имеют 8 символов, которые слишком коротки в вашем случае.

Вы можете использовать LENGTH и информа заявления указать длину и как вы хотите, чтобы прочитать в данных

После INFILE и INPUT, вы можете добавить ДЛИНЫ и/или заявления Informat.

INFORMAT указывает, как переменная форматируется при ее чтении (в файле CSV), в то время как FORMATS контролирует, как формат отображается в SAS.

Вам не нужно читать все переменные в качестве символьных переменных. Формат и тип даты можно указать в поле

FILENAME IPC3data zip 'C:\Users\********\IPC3data.zip' member='tls201_appln.csv'; 

DATA newdata; 

INFILE IPC3data DLM=';' DSD FIRSTOBS=2; 



INPUT appln_id $ appln_auth $ appln_nr $ appln_kind $ appln_filing_date appln_filing_year $ appln_nr_epodoc $ appln_nr_original $ ipr_type $ internat_appln_id $ int_phase $ reg_phase $ nat_phase $ earliest_filing_date earliest_filing_year $ earliest_filing_id $ earliest_publn_date earliest_publn_year $ earliest_pat_publn_id $ granted $ docdb_family_id $ inpadoc_family_id $ docdb_family_size $ nb_citing_docdb_fam $ nb_applicants $ nb_inventors; 


INFORMAT appln_filing_date earliest_filing_date earliest_publn_date anydtdte.; 
FORMAT appln_filing_date earliest_filing_date earliest_publn_date DATE9.; 
+1

Переместите INFORMAT и FORMAT после инструкции INPUT. В противном случае вы вынуждаете переменные, перечисленные там, первыми переменными в наборе данных. Оператор INPUT по-прежнему будет работать нормально, так как выражение INFORMAT и FORMAT не имеет значения, поскольку они не являются исполняемыми операциями. – Tom

+0

Уважаемый Реэза, спасибо за ответ! Тем не менее, я всегда получаю сообщение об ошибке «Формат $ DATE не найден или не может быть загружен». как в информационных, так и в форматированных строках ... – Annina

+0

Вы должны убедиться, что $ будет удален из инструкции ввода, если вы указали информацию о дате. – Reeza

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