1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
68
69 %LET CourseRoot = /home/u63571562/BIOS6680_2023;
70
71 OPTIONS DLCREATEDIR;
72
73 LIBNAME Create "&CourseRoot/CDPHE Study";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study
74 LIBNAME Create "&CourseRoot/CDPHE Study/Data";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data
75 LIBNAME Create "&CourseRoot/CDPHE Study/Data/1_Source";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source
76 LIBNAME Create "&CourseRoot/CDPHE Study/Data/2_Import";
NOTE: Libref CREATE refers to the same physical library as COIMPT.
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/2_Import
77 LIBNAME Create "&CourseRoot/CDPHE Study/Data/3_Tabulations";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/3_Tabulations
78 LIBNAME Create "&CourseRoot/CDPHE Study/Data/4_Analysis";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/4_Analysis
79 LIBNAME Create "&CourseRoot/CDPHE Study/Data/5_Results";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/5_Results
80 LIBNAME Create "&CourseRoot/CDPHE Study/Documents";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Documents
81 LIBNAME Create "&CourseRoot/CDPHE Study/Programs";
NOTE: Libref CREATE was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Programs
82
83 LIBNAME Create CLEAR;
NOTE: Libref CREATE has been deassigned.
84
85 OPTIONS NODLCREATEDIR;
86
87 RUN;
88
89 *STEP 2- Create Libraries*;
90
91 LIBNAME CoImpt "&CourseRoot/CDPHE Study/Data/2_Import";
NOTE: Libref COIMPT was successfully assigned as follows:
Engine: V9
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/2_Import
92
93 *STEP 3- Read in Demographic Data*;
94
95 *3.1 - Disabilites*;
96 DATACoImpt.Disabilities;
97 INFILE"&CourseRoot/CDPHE Study/Data/1_Source/disabilities.txt" FIRSTOBS = 2 DELIMITER = '&' truncover;
98 INPUTtract_fips:$10.
99 pctn_disability:$4.;
100 RUN;
NOTE: The infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/disabilities.txt" is:
Filename=/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/disabilities.txt,
Owner Name=u63571562,Group Name=oda,
Access Permission=-rw-r--r--,
Last Modified=25Sep2023:12:38:41,
File Size (bytes)=20327
NOTE: 1242 records were read from the infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/disabilities.txt".
The minimum record length was 11.
The maximum record length was 15.
NOTE: The data set COIMPT.DISABILITIES has 1242 observations and 2 variables.
NOTE: DATA statement used (Total process time):
real time 0.11 seconds
user cpu time 0.00 seconds
system cpu time 0.00 seconds
memory 879.31k
OS Memory 29284.00k
Timestamp 09/26/2023 06:35:37 PM
Step Count 842 Switch Count 1
Page Faults 0
Page Reclaims 90
Page Swaps 0
Voluntary Context Switches 41
Involuntary Context Switches 0
Block Input Operations 0
Block Output Operations 264
101
102
102 ! PROC CONTENTS;
103
104 *3.2 - Education*;
NOTE: PROCEDURE CONTENTS used (Total process time):
real time 0.07 seconds
user cpu time 0.04 seconds
system cpu time 0.00 seconds
memory 1833.40k
OS Memory 29544.00k
Timestamp 09/26/2023 06:35:37 PM
Step Count 843 Switch Count 0
Page Faults 0
Page Reclaims 137
Page Swaps 0
Voluntary Context Switches 12
Involuntary Context Switches 3
Block Input Operations 488
Block Output Operations 16
105 DATACoImpt.Education;
106 INFILE"&CourseRoot/CDPHE Study/Data/1_Source/Education.txt" FIRSTOBS = 2 DELIMITER = '|';
107 INPUTpctn1:3.
108 pctn2:3.
109 pctn3:3.
110 pctn4:3.
111 tract_fips$12.;
112 RUN;
NOTE: The infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt" is:
Filename=/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt,
Owner Name=u63571562,Group Name=oda,
Access Permission=-rw-r--r--,
Last Modified=25Sep2023:12:38:41,
File Size (bytes)=38964
NOTE: 1242 records were read from the infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt".
The minimum record length was 22.
The maximum record length was 32.
NOTE: The data set COIMPT.EDUCATION has 1242 observations and 5 variables.
NOTE: DATA statement used (Total process time):
real time 0.05 seconds
user cpu time 0.01 seconds
system cpu time 0.01 seconds
memory 874.34k
OS Memory 29540.00k
Timestamp 09/26/2023 06:35:37 PM
Step Count 844 Switch Count 1
Page Faults 0
Page Reclaims 81
Page Swaps 0
Voluntary Context Switches 50
Involuntary Context Switches 6
Block Input Operations 0
Block Output Operations 264
113
114
114 ! PROC CONTENTS;
115
116 *3.3 - Employment*;
117 LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
NOTE: Libref CHECK was successfully assigned as follows:
Engine: XLSX
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Employment.xlsx
118 LIBNAME Check CLEAR;
NOTE: Libref CHECK has been deassigned.
119
120 LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
ERROR: Unable to clear or re-assign the library COIMPT because it is still in use.
ERROR: Error in the LIBNAME statement.
NOTE: PROCEDURE CONTENTS used (Total process time):
real time 0.10 seconds
user cpu time 0.04 seconds
system cpu time 0.00 seconds
memory 965.06k
OS Memory 29800.00k
Timestamp 09/26/2023 06:35:37 PM
Step Count 845 Switch Count 5
Page Faults 0
Page Reclaims 95
Page Swaps 0
Voluntary Context Switches 58
Involuntary Context Switches 4
Block Input Operations 288
Block Output Operations 24
121 PROC PRINT
122 DATA = CoImpt.Employment;
123 LABEL;
124 RUN;
NOTE: There were 53 observations read from the data set COIMPT.EMPLOYMENT.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.04 seconds
user cpu time 0.05 seconds
system cpu time 0.00 seconds
memory 714.93k
OS Memory 29540.00k
Timestamp 09/26/2023 06:35:37 PM
Step Count 846 Switch Count 0
Page Faults 0
Page Reclaims 66
Page Swaps 0
Voluntary Context Switches 8
Involuntary Context Switches 4
Block Input Operations 0
Block Output Operations 16
125
126
126 ! PROC CONTENTS;
127
128 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
138 I am a new SAS user working on a class project. I had each piece of this code working, but when I ran it all together to make sure it still worked, I got two errors: 'Unable to clear or re-assign the library COIMPT because it is still in use' and 'Error in the LIBNAME statement.' In results, all of the Proc Contents for Education shows twice, and all of the Proc Contents for Employment show as missing. Despite my efforts, I can't find the mistakes to fix these errors. What are my mistakes, and how can I prevent this from happening again in future steps? Here is the code:
105 DATA CoImpt.Education;
106 INFILE"&CourseRoot/CDPHE Study/Data/1_Source/Education.txt" FIRSTOBS = 2 DELIMITER = '|';
107 INPUTpctn1:3.
108 pctn2:3.
109 pctn3:3.
110 pctn4:3.
111 tract_fips$12.;
112 RUN;
NOTE: The infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt" is:
Filename=/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt,
Owner Name=u63571562,Group Name=oda,
Access Permission=-rw-r--r--,
Last Modified=25Sep2023:12:38:41,
File Size (bytes)=38964
NOTE: 1242 records were read from the infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt".
The minimum record length was 22.
The maximum record length was 32.
NOTE: The data set COIMPT.EDUCATION has 1242 observations and 5 variables.
NOTE: DATA statement used (Total process time):
real time 0.05 seconds
user cpu time 0.01 seconds
system cpu time 0.01 seconds
113
114
114 ! PROC CONTENTS;
115
116 *3.3 - Employment*;
117 LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
NOTE: Libref CHECK was successfully assigned as follows:
Engine: XLSX
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Employment.xlsx
118 LIBNAME Check CLEAR;
NOTE: Libref CHECK has been deassigned.
119
120 LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
ERROR: Unable to clear or re-assign the library COIMPT because it is still in use.
ERROR: Error in the LIBNAME statement.
In line 114 of the log, you call PROC CONTENTS, but you don't end it with a run; statement. So when it comes to the LIBNAME, data set COIMPT.EDUCATION is still in use by PROC CONTENTS; and so you cannot re-assign the libname while it is in use. You can fix this with
proc contents;
run;
Using the run; statement also fixes the PROC CONTENTS for Employment. The PROC CONTENTS doesn't execute until it comes to a run; but the program ends before that.
Using a run; to end all PROCs (except for SQL, GLM, REG and a few others) is a very good habit to get into.
Additional good things to get into the habit of doing: do not keep re-using the same libname to refer to multiple different data sources.
When you have errors in your code, show us the ENTIRE log.
Please copy the entire log as text and then click on the </> icon and paste the log into the window that appears.
105 DATA CoImpt.Education;
106 INFILE"&CourseRoot/CDPHE Study/Data/1_Source/Education.txt" FIRSTOBS = 2 DELIMITER = '|';
107 INPUTpctn1:3.
108 pctn2:3.
109 pctn3:3.
110 pctn4:3.
111 tract_fips$12.;
112 RUN;
NOTE: The infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt" is:
Filename=/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt,
Owner Name=u63571562,Group Name=oda,
Access Permission=-rw-r--r--,
Last Modified=25Sep2023:12:38:41,
File Size (bytes)=38964
NOTE: 1242 records were read from the infile "/home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Education.txt".
The minimum record length was 22.
The maximum record length was 32.
NOTE: The data set COIMPT.EDUCATION has 1242 observations and 5 variables.
NOTE: DATA statement used (Total process time):
real time 0.05 seconds
user cpu time 0.01 seconds
system cpu time 0.01 seconds
113
114
114 ! PROC CONTENTS;
115
116 *3.3 - Employment*;
117 LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
NOTE: Libref CHECK was successfully assigned as follows:
Engine: XLSX
Physical Name: /home/u63571562/BIOS6680_2023/CDPHE Study/Data/1_Source/Employment.xlsx
118 LIBNAME Check CLEAR;
NOTE: Libref CHECK has been deassigned.
119
120 LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
ERROR: Unable to clear or re-assign the library COIMPT because it is still in use.
ERROR: Error in the LIBNAME statement.
In line 114 of the log, you call PROC CONTENTS, but you don't end it with a run; statement. So when it comes to the LIBNAME, data set COIMPT.EDUCATION is still in use by PROC CONTENTS; and so you cannot re-assign the libname while it is in use. You can fix this with
proc contents;
run;
Using the run; statement also fixes the PROC CONTENTS for Employment. The PROC CONTENTS doesn't execute until it comes to a run; but the program ends before that.
Using a run; to end all PROCs (except for SQL, GLM, REG and a few others) is a very good habit to get into.
Additional good things to get into the habit of doing: do not keep re-using the same libname to refer to multiple different data sources.
Thank you! This removed the errors from the code, and I see what I did wrong and how I can improve.
However, I am graded on the proc contents, and this did not fix what appears in results. When I run just the piece of code for 'employment':
LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx"; LIBNAME Check CLEAR; LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx"; PROC PRINT DATA = CoImpt.Employment; LABEL; RUN; PROC CONTENTS; RUN;
It gives me the proc contents for 'education,' and with no observations (see photo). What is the reason for this? Why would I not be seeing the two numeric values that are in the employment data? Thank you for your feedback.
Your code does not make much sense at all.
You define a libref and then clear it.
LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
LIBNAME Check CLEAR;
Since SAS does not know if the meant to use CHECK to create and XLSX file or read from an existing XLSX file the first libname will work whether or not the file specified exists or not.
That might have a side effect of creating an empty XLSX file when the named file does not exist.
You then have another libref pointing at the exact same file.
LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx";
Then a PROC PRINT step with an invalid statement in the middle of it (and a lot of random spaces).
PROC PRINT
DATA = CoImpt.Employment;
LABEL;
RUN;
Perhaps you meant to include the LABEL option on the PROC PRINT statement?
You can save yourself a lot of headaches if you get in the habit of placing the semicolon that ends a multiple line statement on a new line by itself where it is more obvious when scanning the code.
PROC PRINT
DATA = CoImpt.Employment
LABEL
;
RUN;
Then you run a PROC CONTENTS but you don't tell PROC CONTENTS what dataset to run on. So it will run on the last dataset you created, but we cannot tell what dataset that would be since none of the code you posted created any datasets. Perhaps you meant:
proc contents data=CoImpt.Employment;
run;
@BLT2023 wrote:
Thank you! This removed the errors from the code, and I see what I did wrong and how I can improve.
However, I am graded on the proc contents, and this did not fix what appears in results. When I run just the piece of code for 'employment':
LIBNAME Check XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx"; LIBNAME Check CLEAR; LIBNAME CoImpt XLSX "&CourseRoot/CDPHE Study/Data/1_Source/Employment.xlsx"; PROC PRINT DATA = CoImpt.Employment; LABEL; RUN; PROC CONTENTS; RUN;It gives me the proc contents for 'education,' and with no observations (see photo). What is the reason for this? Why would I not be seeing the two numeric values that are in the employment data? Thank you for your feedback.
When you don't specify a data set for PROC CONTENTS, it (and all SAS PROCs) work on the most recently created data set. A LIBNAME does not create a data set. You really ought to use for PROC CONTENTS and specify the data set name.
proc contents data=CoImpt.Employment;
run;
This is another habit that you should get into and do without fail.
This makes sense, and works in my code. However, it replaces the number of observations in the results with "." How do I account for this? Thank you for answering my questions!
PROC CONTENTS does not know the number of observations in foreign databases. It can only do that for actual SAS datasets. Since your code is using the foreign database engine of XLSX to point to a sheet in an Excel file then PROC CONTENTS will not display the number of observations.
If you want the number of observations you will have to either count them yourself (like select count(*) from ..... in PROC SQL code).
Or copy the sheet to an actual SAS dataset, perhaps in the WORK library, and run PROC CONTENTS on that actual SAS dataset.
Got it, now I understand. Thank you so much for the clarification.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.
Find more tutorials on the SAS Users YouTube channel.