News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren ETL & Base SAS Einlesen von Textdateien mit sehr langen Zeilen 8 September, 2011-09:32 L Im Umgang mit SAS bin ich Neuling und versuche gerade, eine aus Excel exportierte Messwerttabelle einzulesen (mit Tabulator als Trennzeichen). (Das SAS läuft auf einem Unix- Server; daher dürfte direkter Excel-Import schwierig sein, nehme ich an. Richtig?) Die Tabelle enthält diverse verschiedene Formate: Datum, Zeichenketten, ganze Zahlen und Zahlen in wissenschaftlicher Darstellung, sowie manchmal auch vielen leeren Spalten dazwischen, alles getrennt jeweils einen Tabulator. Im Falle von vielen nebeneinander befindlichen leeren Spalten heißt das natürlich auch: viele Tabulatoren nebeneinander. Meine Datei lese ich mit folgender Kommandosequenz (gekürzt): INFILE 'Dateiname.txt' DLM='09'x DSD MISSOVER FIRSTOBS=133 LINESIZE=255; INPUT DatumMess DatumProbe Probenbezeichnung $ /*... */; Es werden dabei insgesamt bis zu 47 Spalten eingelesen (von denen aber normalerweise nicht alle gefüllt sind). Mein Problem ist jetzt, dass bei sehr vielen leeren Spalten nebeneinander, vor allem im "hinteren" Bereich einer Zeile, gerne leere Spalten überlesen werden und die hintersten Elemente in der Folge zu weit links landen. Gibt es einen offensichtlichen Fehler, den ich dabei begangen habe? Wäre klasse, wenn Ihr mir weiterhelfen könntet. Foren: ETL & Base SAS TERMSTR? 8 September, 2011-15:00 JanHeuer ohne die Daten und ohne das LOG kann man nur raten, was da schief geht. Bei deinem INFILE- Statement sind mir zwei Dinge aufgefallen: Zum einen scheint mir die Option LINESIZE für 47 Spalten sehr klein. Du hast ja schon 70 Zeichen in den ersten drei Spalten. Windows(Excel) und UNIX verwenden unterschiedliche Zeilenenden. Du solltest es mal mit TERMSTR = CRLF versuchen, da Excel den Zeilenumbruch innerhalb einer Zelle mit LF markiert. Dies
ist aber unter UNIX das Standardzeichen für einen Zeilenumbruch. SAS liest zumindest unter Windows die Daten ohne die TERMSTR - Option falsch ein, wenn in Zellen Zeilenumbrüche vorkommen. Schöne Grüße Jan Neue Frage: Datum einlesen u. "Einlesen von Textdateien": Erledi Hallo Jan, 9 September, 2011-13:12 L erstmal danke für den Tipp mit der TERMSTR-Option und der Zeilenlänge. Ich habe das Problem mit den Spalten doch noch selbst gelöst: Es lag schlicht und ergreifend daran, dass in der betreffenden Exceltabelle Spalten fehlten, was bei einer derartig breiten Tabelle ja nicht unbedingt direkt auffällt. Und da ich eher an meinen SAS-Kenntnissen als an den zu analysierenden Daten gezweifelt habe, bin ich auch nicht auf die Idee gekommen, dort nach dem Fehler zu suchen. Tut mir leid, Euch damit belästigt zu haben. Ein Problem habe ich aber noch nicht selbst lösen können: In den ersten beiden Spalten der Tabelle ist jeweils ein Datum der Form "22.04.2009" enthalten. Das als String einzulesen funktioniert auch tadellos, ist aber nicht unbedingt das, was ich möchte. Ich habe versucht, die ersten beiden Zellen als "Datum" einzulesen mit folgendem Ansatz: INPUT DatumMess DatumProbe Probenbezeichnung /*...*/ Das Resultat (Logfile) ist dann erstmal der Hinweis des Programms: NOTE: Variable DEUDFDD10 ist nicht initialisiert. Und als Ausgabe während des Einlesens: DatumMess=22.04.2009 DEUDFDD10= DatumProbe=17.04.2009 Probenbezeichnung=Wasserprobe /*... */ Anscheinend wird also nicht erkannt, dass die beiden ersten Felder als Datum bezeichnet werden sollen, sondern es wird eine neue Variable namens DEUDFDD10 "aufgemacht". Wie bekomme ich es jetzt hin, dass die ersten beiden Felder direkt als Datum eingelesen und auch so interpretiert werden? (Ich habe auch schon probiert, statt DEUDFDD10 ddmmyy10 zu benutzen - mit demselben Ergebnis) Wäre klasse, wenn Ihr mir auf die Sprünge helfen könntet (auch, falls es wieder so ein dämlicher Anfängerfehler sein sollte).
Beispielcode 12 September, 2011-09:22 HansKneilmann ohne Beispielcode ist es sehr mühselig sich vorzustellen was falsch läuft... Und was sehr mühselig ist, wird oft vermieden... Man muss sich ja nicht quälen, gell? Also: Erst Beispielcode, dann Hilfe. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) Hallo Hans, ich wollte Hallo Hans, 12 September, 2011-10:26 L ich wollte ursprünglich meinen Einlesecode auf das nötigste kürzen, um den Beitrag lesbarer zu halten (dafür, dass es den Anschein hatte, als würde ich nur einzelne Befehle posten, bitte ich um Entschuldigung). Tatsächlich steht auch nicht viel mehr drin (außer, dass die INPUT-Zeile recht lang ist): DATA Peaks; INFILE 'Messdaten-Proben.txt' DLM='09'x DSD MISSOVER TERMSTR=CRLF FIRSTOBS=133 LINESIZE=1024; INPUT DatumMess DatumProbe Probenbezeichnung $ Messgefaess $ Polarisation $ Schrittweite Bemerkungen $ AnzPeaks Grundlinie Imax1 nu1 FWHM1 Imax2 nu2 FWHM2 Imax3 nu3 FWHM3 Imax4 nu4 FWHM4 Imax5 nu5 FWHM5 Imax6 nu6 FWHM6 Imax7 nu7 FWHM7 ImaxOHstICE nuohstice FWHMOHstICE ImaxOHstLIQ nuohstliq FWHMOHstLIQ ImaxDB nudb FWHMDB Ort $ AnzSchoepf RefIntNr RefIntOrdNr AnzPrfuerRef RefInt; RUN; Zwei der einzulesenden Datenzeilen sehen so aus: 22.04.2009 17.04.2009 Wasserprobe-#1.dat grschale ssp 4 "Kommentar" 3 1.59E-06 5.70E-06 2846 20 5.61E-06 2870 20 7.10E-06 2942 28 6.04E-06 3462 228 1.94E-05 3706 36 NOK -1 2 4.52E-04 22.04.2009 17.04.2009 Wasserprobe-#2.dat grschale ssp 4 s.o. 3 4.71E-07 1.27E-05 2854 16 1.40E-05 2874 24 1.25E-05 2950 36? 3514 256 8.20E-06 3718 36 NOK 7 2 4.52E-04 Das Problem, das ich noch zu "erschlagen" habe, ist, SAS klar zu machen, dass es auch als Datum zu interpretieren und zu verarbeiten ist.
Herzlichen Dank schonmal im Voraus für die Hilfe! Fehler im Informat ich würde sagen, dass Dein Code in dieser Zeile falsch ist: 12 September, 2011-12:29 HansKneilmann So wie Du es geschrieben hast ist DEUDFDD10 eine Variable (Spalte) und kein Format. Eine Variable kann es eigenlich nicht sein, denn Du hast sie nirgends eingelesen oder erzeugt und deshalb kommt im LOG: NOTE: Variable DEUDFDD10 is uninitialized. Ausserdem taucht DEUDFDD10 doppelt auf, was auch geben Variable und für Format spricht. Wenn es ein Format sein sollte, dann muß es so aussehen:.. (Der Punkt am Ende von DEUDFDD10 ist der Unterschied...) Aber dieses Format muß bekannt sein, entweder ist es ein Standard-Format (ich kenne es nicht) oder Du hast bzw. man hat es irgendwo vorher definiert. Wenn es nicht bekannt ist kommt im Log der Fehler ERROR 48-59: The informat DEUDFDD was not found or could not be loaded. Gruß Hans Kneilmann, Schäfer Shop GmbH (SSI) P.S.: Wenn es das passende Datums-Format nicht gibt hilft immer: Als Char-String einlesen, den String umbauen und dann ins date-format umwandeln Informat ANYDTDTE32. 12 September, 2011-13:23 JanHeuer DEUDFDD10. kenn ich auch nicht. Es müsste aber ANYDTDTE32. funktionieren. Schöne Grüße Jan
Hallo Hans, hallo Hallo Hans, hallo Jan, 12 September, 2011-16:00 L Herzlichen Dank! Jetzt läuft's. Das grundlegende Problem war erstmal der Punkt hinter der Formatangabe. Die Bezeichnung DEUDFDD10 wurde danach tatsächlich nicht erkannt. Die Bezeichnung hatte ich aus einer Dokumentation auf de.saswiki.org herausgelesen. Zum Ziel gekommen bin ich dann mit DDMMYY10. ANYDTDE32 habe ich danach nicht mehr probiert bzw. probieren müssen. Ich werde mir aber merken, dass sie existiert. Danke schön!