BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Damon1
Obsidian | Level 7

Hi everyone, 

 

Pretty new to SAS, so I apologize in advance. I'm trying to import the attached dataset, but I'm having an issue getting it to read the DOB column. 

 

I am using the following code:

 

DATA employees;

 INFILE "C:\Users\dlobsien\Desktop\employees.txt" dsd;

 INPUT SSN $11. Name $17. DOB DATE.9 PayGrade $57-60 Salary COMMA10. Position :$27.;

 TITLE employee data;

 

It just shows all the observations under this column as missing data. Everything else reads as I want it to. 

 

I have also tried putting @xx before it as well entering the following with no success:

 

INFORMAT DOB ANYDTDTE.;

INPUT ... DOB Pay...; 

FORMAT DOB DATE9.

 

If anyone could provide any help it would be greatly appreciated. 

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

Code, tested with your file with UE on a Mac:

data employees;
infile '/folders/myfolders/employees.txt' truncover;
input
  @1  ssn       $11.
  @16 name      $30.
  @47 dob       date9.
  @57 paygrade  $4.
  @62 salary    dollar10.
  @73 position  $30.
;
format
  dob e8601da10.
  salary dollar12.2
;
run;

View solution in original post

7 REPLIES 7
Kurt_Bremser
Super User

You have a fixed-width layout, so you have to use formatted input (as you did), but because of the white space in between you need to use position indicators. You must take care of exact positioning.

Name seems to start at position 16 (11 characters SSN, 4 characters space). Inspect your file with a good editor (notepad++) that shows the cursor position.

ed_sas_member
Meteorite | Level 14

Hi @Damon1 

 

The basic approach for fixed width is to specify the start and end column for each variable.

Could you please try this:

DATA employees;
	INFILE "C:\Users\dlobsien\Desktop\employees.txt" dsd;
	INPUT SSN $ 1-11 Name $ 16-32 DOB:DATE9. PayGrade $57-60 Salary:DOLLAR10. Position $ 73-99;
	FORMAT DOB DATE9. Salary DOLLAR10.;
RUN;

 

Best,

Damon1
Obsidian | Level 7

so, this works to get the date in; however, now it gives me both the SSN and Name data under the "positions" column. I have tried setting the length and putting @72 before it in the infile statement.

Damon1
Obsidian | Level 7

Ah, I should have used @73 instead, which worked. Thanks so much 🙂 

 

 

Kurt_Bremser
Super User

Code, tested with your file with UE on a Mac:

data employees;
infile '/folders/myfolders/employees.txt' truncover;
input
  @1  ssn       $11.
  @16 name      $30.
  @47 dob       date9.
  @57 paygrade  $4.
  @62 salary    dollar10.
  @73 position  $30.
;
format
  dob e8601da10.
  salary dollar12.2
;
run;
Damon1
Obsidian | Level 7
worked perfectly! thanks so much!
Tom
Super User Tom
Super User

First thing it to fix the INFILE statement. You data is NOT delimited, so remove the DSD option. Also your lines might not have trailing blanks so add the TRUNCOVER option.

 INFILE "C:\Users\dlobsien\Desktop\employees.txt" truncover;

Your fields appear to be in fixed columns but there is no way to use an informat when using a range of columns ( 10-20) in the INPUT statement. So you need to read the DOB and SALARY fields differently.

 

1) You can use formatted mode. Make sure to start in the right column. This is best if the field might be all blanks. 

 INPUT SSN $ 1-11 Name $ 12-46 @47 DOB DATE9. PayGrade $57-60 @62 Salary COMMA11. Position $ 73-99 ;

2) Use list mode, but make sure there is something in the field. Use a period to indicate a missing value otherwise SAS will scan past the end of the field until it sees something to read.  Note that with list mode the width of the INFORMAT specification does not matter, the INPUT statement adjusts the width to match the width of the next thing on the line.

 

2a) You can either add an INFORMAT statement.

 INPUT SSN $ 1-11 Name $ 12-46 DOB PayGrade $57-60 Salary Position $ 73-99 ;
 informat dob date. salary comma. ;

2b) Or us the colon modifier in front of the in-line informat specification.

INPUT SSN $ 1-11 Name $ 12-46 DOB :date. PayGrade $57-60 Salary :comma. Position $ 73-99 ;

Here are a few of the lines from your attached file, with a ruler to see the column locations.

         1         2         3         4         5         6         7         8         9
----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+
XXX-XX-3484    Edward Rogers                  27JUN1989 GR20 $4,653.23  Business Analyst
XXX-XX-3305    Steven Price                   30JUN1961 GR20 $5,581.94  Systems Engineer I
XXX-XX-2575    Donald Graham                  07MAR1959 GR26 $15,081.73 Human Resources Director

 

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

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
  • 7 replies
  • 934 views
  • 2 likes
  • 4 in conversation