2016-07-13 7 views
0

Ich komme zu SAS von R, in dem dieses Problem ziemlich einfach zu lösen ist.Geben Sie leere Werte durch Zeichenkette in PROC IMPORT

Ich versuche, eine Reihe von CanSim CSV-Dateien (eine example table here) mit einer %Macro Funktion zu laden.

%Macro ReadCSV (infile , outfile); 
PROC IMPORT 
     DATAFILE= &infile. 
     OUT= &outfile. 
     DBMS=CSV REPLACE; 
GETNAMES=YES; 
DATAROW=2; 
RUN; 
%Mend ReadCSV; 
%ReadCSV("\\DATA\CanSimTables\02820135-eng.csv", work.cs02820135); 
%ReadCSV("\\DATA\CanSimTables\02820158-eng.csv", work.cs02820158); 

Das Problem ist, dass die numerische Value Spalte „..“ in der alle csv ist, wenn der Wert fehlt. Dies erzeugt einen Fehler, wenn IMPORT zu den Zeilen mit dieser Zeichenfolge gelangt.

Gibt es eine Möglichkeit, IMPORT mitzuteilen, dass ".." entfernt oder als fehlende Werte behandelt werden sollte? (Ich fand Foren, die sich auf die DSD Option beziehen, aber das scheint mir hier nicht zu helfen.)

Danke!

+0

Haben die Dateien jedes Jahr das gleiche Layout? Wenn ja, sollten Sie nur einen Datenschritt schreiben, um die Dateien zu lesen. Dann haben Sie die Kontrolle darüber, wie es die Daten liest. – Tom

+0

Ich bin nicht sicher, was Sie genau meinen, aber nein (?): In jeder CSV-Datei sind die Zeilen nach Ort und Zeit indiziert, die zwischen den Dateien unterscheiden können. Die Spalten (die Nummer und ihre Namen) unterscheiden sich. Es gibt jedoch Ähnlichkeiten. Zum Beispiel ist der numerische Wert immer in einer Spalte namens "Value". Hilft mir das? –

+0

Können Sie bitte das SAS-Protokoll einfügen? Das SAS-Protokoll zeigt Informationen über den verwendeten Import- und Datenschritt an - wir können es als Vorlage verwenden, um das Verhalten zu ändern. – Altons

Antwort

3

PROC IMPORT kann nur die Struktur Ihrer Daten erraten. Zum Beispiel könnte es die .. sehen und davon ausgehen, dass die Spalte eine Zeichenkette anstelle einer Zahl enthält. Es kann auch andere Entscheidungen treffen, die das generierte Dataset unbrauchbar machen können.

Sie werden besser bedient, um Ihren eigenen Datenschrittcode zu schreiben, um die Datei zu lesen. Es ist nicht sehr schwer zu tun. Für Ihre Beispiel-verknüpfte Datei habe ich nur die erste Zeile der CSV-Datei kopiert und eingefügt, die Kommas entfernt, die Namen für gültige Variablennamen erstellt und einige Annahmen getroffen, wie lange die Zeichenvariablen erstellt werden müssen.

data want ; 
    infile "&path/&fname" dsd truncover firstobs=2 ; 
    length Ref_Date $7 GEO $100 Geographical_classification $20 
     CHARACTERISTICS $100 STATISTICS DATATYPE $50 Vector Coordinate $20 
     Value 8 
    ; 
    input (Ref_Date -- Value) (??) ; 
run; 

Der ?? Modifikator wird SAS sagen keine Fehler zu melden, wenn der Konvertit den Text in der Spalte Wert in einer Reihe versuchen. So werden die .. und andere Müll in der Datei fehlende Werte generieren.

+0

Ausgezeichnet. Der '' 'Modifikator scheint zu sein, was ich brauchte. Danke vielmals –

0

Nicht explizit relevant für diese Frage, aber - wenn Ihr Problem "N" oder "D" oder ähnlich war, dass Sie vermisst werden wollten, gäbe es eine etwas einfachere Lösung: die missing statement (wichtig unterscheidet sich von der missing option) .

missing M; 

Das SAS erzählt ein einzelnes Zeichen M in den Daten als fehlender Wert zu sehen, und es in entsprechend lesen. Es würde es in .M speziellen fehlenden Wert lesen, der funktionell ähnlich ist . regulären fehlt (aber nicht wirklich gleich in einer Gleichheitsanweisung).

Verwandte Themen