BookmarkSubscribeRSS Feed
sleretrano
Quartz | Level 8

I'm trying to read from a UNIX file whose rows look like this:

42000001251100:137224761:123272858:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:DW7 :P:CP :+002296660:+00000005300:+00000598760:+00000132500:+00000132500:+00000000000:+00000250000:  :00010101:ENC:20120314:ENC:20120215:0:502:00010101:20100914:20111027:+00000007300:119

Notice that after the last field there isn't a ':' delimiter. I checked in a text editor and there's no "end of line" (i.e. CRLF, CR, LF).

 

 

When I read from the file, everything works fine except for the last variable which always comes out empty.

It's not a lrecl issue, I've checked.

 

I managed to fix this by doing the following:

lrecl=500000

DLM=':'

missover DSD;

Input Var1-Var35 
        @350 Var36;

As the last variable (the thirty sixth one) starts at the position 350.

 

 

However I was looking for a more elegant solution.

 

Any ideas?

 

This a follow up from this question: https://communities.sas.com/t5/SAS-Enterprise-Guide/Reading-from-Unix/td-p/307696

10 REPLIES 10
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Firstly, that is not a semicolon delimited file, it is a colon delimited file.  Next, I ran this code:

data want;
  infile "s:\temp\rob\a.txt" lrecl=500000 dlm=':' missover dsd;
  input Var1-Var36;
run;

And it imported that row you have given quite simply.  There are problems however as some of the variables have character data, those are not read in as the input defaults to numeric.  Also, if it is from Unix you might need to put the option termstr=, per the guidance given here:

http://support.sas.com/kb/14/178.html

 

sleretrano
Quartz | Level 8
I don't understand why you point out that it's not a semicolon delimited file, what is the relevance of that?
I'm aware that some vars have characters, I can fix those. My issue is with the last variable. It doesn't work for me. I tried termstr=CR, termstr=CRLF and termstr=LF, nothing worked.
data_null__
Jade | Level 19

Do you get a message that looks like this.

 

NOTE: Invalid data for var36 in line 1 350-353.
RULE:     ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0                      
1         42000001251100:137224761:123272858:+00000000000:+00000000000:+00000000000:+00000000000:+00000000000:
     101  +00000000000:+00000000000:+00000000000:+00000000000:+00000000000:DW7 :P:CP :+002296660:+00000005300:
     201  +00000598760:+00000132500:+00000132500:+00000000000:+00000250000:  :00010101:ENC:20120314:ENC:201202

     301  15:0:502:00010101:20100914:20111027:+00000007300:119. 353
    ZONE  33333333333333333333333333333333333323333333333333330
    NUMR  15A0A502A00010101A20100914A20111027AB00000007300A119D
var1=4.2000001E13 var2=137224761 var3=123272858 var4=0 var5=0 var6=0 var7=0 var8=0 var9=0 var10=0 var11=0 var12=0 var13=0 var14=DW7
var15=P var16=CP var17=2296660 var18=5300 var19=598760 var20=132500 var21=132500 var22=0 var23=250000 var24=  var25=10101 var26=ENC
var27=20120314 var28=ENC var29=20120215 var30=0 var31=502 var32=10101 var33=20100914 var34=20111027 var35=7300 var36=. _ERROR_=1
_N_=1
sleretrano
Quartz | Level 8
I do! Know how to fix it?
data_null__
Jade | Level 19

What is the last character shown by CHAR  ZONE and NUMR.  In my example they are .0D displayed vertically.

 

What is your SAS version?  You are using some flavor of UNIX right?

sleretrano
Quartz | Level 8
I'm using SAS EG 5.1.
The origin is UNIX, that's correct.
I don't know what you mean with " last character shown by CHAR ZONE and NUMR", can you explain it to me, please?
sleretrano
Quartz | Level 8
Nevermind, I had misread your reply. Let me get back to you.
data_null__
Jade | Level 19

@sleretrano wrote:

I don't know what you mean with " last character shown by CHAR ZONE and NUMR", can you explain it to me, please?

You said you received the message similar to mine.  I would be helpful if you show the message and the record dump.  I was asking what it the last character because in my example I made your input file a DOS file and told SAS it was UNIX so that '0d'x became part of the record not TERMSTR.  I'm not saying this is your problem exactly you have not given enough information to determine the problem. 

 

     301  15:0:502:00010101:20100914:20111027:+00000007300:119. 353
    ZONE  33333333333333333333333333333333333323333333333333330
    NUMR  15A0A502A00010101A20100914A20111027AB00000007300A119D

Here we can see that the last character is '0d'x carriage return.   When a record with unprintable characters if displayed with the LIST statement (implied for invalid data) SAS prints the characters in the first line I called CHAR and unprintable characters are displayed with a dot.  Then under that ZONE and NUMR are the values displayed in HEX vertically.  ZONE is the first hex digit and NUMR is the second.  This display requires fixed with font to make sense.

sleretrano
Quartz | Level 8
I'm sorry, I actually don't get that message. I did at some point get a similar one, but it's not the same and I don't get the rows with "NUMR" and "ZONE" behind. The similar message I got was because I formated a character variable as a number variable.
Ksharp
Super User
Read it as character , Can it work ?

Input Var1-Var35 
        @350 Var36 : $20.;

If it was worked, then your termstr= is not right, try others like termstr=nl.

Or your file is stream file (not have row-end character),then you need other input method like:

Input Var1-Var35 
        @350 Var36 @@;

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

SAS Enterprise Guide vs. SAS Studio

What’s the difference between SAS Enterprise Guide and SAS Studio? How are they similar? Just ask SAS’ Danny Modlin.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 1268 views
  • 1 like
  • 4 in conversation