2016-12-05 46 views
0

現在、圧縮されたCSVファイルをSASにインポートしようとしています。日付はYYYY-MM-DDの形式で3列あります。このcsvファイル内のすべてのデータは一意の行になっていますので、文字列であり数字として認識されないと思います(私は最近コーディングを始めましたが残念ですが、まだ多くの基本を学んでいます)。 何が起こるかは、SASは8文字と仮定し、それは基本的に1日を欠いている2010-08-と出てくる。 私は入力を使ってそれを回避するためにいくつかの方法を試しましたが、これまで解決していませんでした。私は空の列または変換番号(52789など - 私はSASが参考に使用している1960年の日付から推測されます)を取得します 私は皆さんに私にこれをどうやっていくかのヒントを教えていただければ幸いです。 コードは: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文を使って変数を読みたい順に変数を定義する方がずっと簡単です。ここでは、現在のINPUTステートメントに基づいて変数を定義する方法をSASが推測した方法と同じですが、すべての..._日付変数をデフォルトの8文字の代わりに10文字の文字列に変更しました。おそらく、他の変数の長さ(または型)も変更する必要があります。あなたが最初と最後の変数名の間に--を置くことによって、位置変数リストを使用することができますので、

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ステートメントは、非常にシンプルにすることができます。

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右、私はまた、いくつかのID列のための8つ以上のスペースが必要です。しかし私がinformat/format部分を追加すると、エラー文 "Informat $ yymmdd。が見つかりませんでした"または "読み込めませんでした"が表示されます。私はまだこれを追加する必要があるかどうかわからない長さの声明は私に完全な日付を与えた? – Annina

+0

変数の型に合ったインフォーマットを使用する必要があります。あなたの変数は文字SASだったので、文字結果を生成するインフォーマットを探しています。したがって、エラーメッセージの余分な$。変数を必ず数値として定義してください。 – Tom

0

デフォルトでは、SAS文字列は8文字に設定されています。これはあなたのケースでは短すぎます。

あなたは長さを指定する長さとINFORMAT文を使用することができますし、INFILEと入力された後のデータで

を読みたいどのようにあなたの長さおよび/または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

INPUTステートメントの後にINFORMATおよびFORMATを移動します。それ以外の場合は、そこにリストされている変数をデータセットの最初の変数にする必要があります。 INFORMATとFORMAT文が表示される場所は実行文ではないので、INPUT文は正常に動作します。 – Tom

+0

親愛なるReezaさん、お返事ありがとうございます!しかし、私はいつも "フォーマット$ DATEが見つからないか、読み込めませんでした"というエラーメッセージが表示されます。 informatとformatの両方の行に... – Annina

+0

日付情報を指定した場合、$が入力文から削除されていることを確認する必要があります。 – Reeza

関連する問題