读入以单引号开头的数据 SAS
Reading in data starting with a single quotation mark SAS
我在从竖线分隔的 txt 文件中读取数据时遇到问题。 address_1 “'S example,". All of these records are followed by a few blank fields. address_1 ends up being "S example |||" for some reason SAS eats the "'” 有 3 个具有这些值的记录,然后最终忽略竖线分隔符。有谁知道如何正确读取以单引号开头的值?
这是我用来读取文件的
data test;
attrib
ID length=
ADDRESS_1 length=
ADDRESS_2 length=
ADDRESS_3 length=
EMAIL_ADDRESS length= ;
INFILE "&directory./Data/Example_Data.txt"
dlm="|" RECFM=v lrecl=32767 dsd firstobs=2 missover end=eof;
input
ID $
ADDRESS_1 : $CHAR50.
ADDRESS_2 : $CHAR50.
ADDRESS_3 : $CHAR50.
EMAIL_ADDRESS $
;
run;
这里有一些示例数据,只需复制并粘贴到记事本中
ID|Address_1|Address_2|Address_3|Email
1234|'S Road,|||email@GMAIL.COM
2534|'S Road,|||email2@GMAIL.COM
烦人的是,当我用示例数据尝试这个时,它起作用了,但是当我使用我的实际数据时,' 消失了,字段被连接成 1。
这是 SAS EG 生成的代码,它可以很好地读取我的原始数据文件
data example;
Length
Address_1 ;
Format
ADDRESS_1 $CHAR40.;
Informat
ADDRESS_1 $CHAR40.;
infile "test_data.txt"
LRECL=226
ENCODING="LATIN1"
TERMSTR=CRLF
DLM='7F'x
MISSOVER
DSD ;
Input
ADDRESS_1 : $CHAR40.;
run;
显示你的数据线。
包含定界符或引号的值应该用引号引起来。因此,如果 address_1
的值是 'S example,
那么在分隔文件中它应该表示为
"'S example,"
或
'''S example,'
INFILE
语句中的 DSD
选项将相邻的定界符识别为指示缺失值,也会从引用值周围删除引号。
您可能遇到了与 SAS Communities 上的这份报告中类似的错误。
https://communities.sas.com/t5/Base-SAS-Programming/Importing-delimited-file-with-text-qualifiers/m-p/449215#M113034
在这种情况下,可以使用 scan()
函数和 m
修饰符而不是 q
修饰符从数据行解析值。
您也可以尝试 pre-processing _INFILE_
变量将裸单引号转换为 "'"
。这是一个简单的例子。
data test2 ;
length var1-var5 ;
infile cards dsd dlm='|' truncover firstobs=2;
input @;
_infile_=tranwrd(cats('|',_infile_,'|'),"|'|","|""'""|");
_infile_=substrn(_infile_,2,length(_infile_)-2);
input var1-var5 ;
cards4;
ID|Address_1|Address_2|Address_3|Email
2534|'S Road,||'|email2@GMAIL.COM
;;;;
我在从竖线分隔的 txt 文件中读取数据时遇到问题。 address_1 “'S example,". All of these records are followed by a few blank fields. address_1 ends up being "S example |||" for some reason SAS eats the "'” 有 3 个具有这些值的记录,然后最终忽略竖线分隔符。有谁知道如何正确读取以单引号开头的值?
这是我用来读取文件的
data test;
attrib
ID length=
ADDRESS_1 length=
ADDRESS_2 length=
ADDRESS_3 length=
EMAIL_ADDRESS length= ;
INFILE "&directory./Data/Example_Data.txt"
dlm="|" RECFM=v lrecl=32767 dsd firstobs=2 missover end=eof;
input
ID $
ADDRESS_1 : $CHAR50.
ADDRESS_2 : $CHAR50.
ADDRESS_3 : $CHAR50.
EMAIL_ADDRESS $
;
run;
这里有一些示例数据,只需复制并粘贴到记事本中
ID|Address_1|Address_2|Address_3|Email
1234|'S Road,|||email@GMAIL.COM
2534|'S Road,|||email2@GMAIL.COM
烦人的是,当我用示例数据尝试这个时,它起作用了,但是当我使用我的实际数据时,' 消失了,字段被连接成 1。
这是 SAS EG 生成的代码,它可以很好地读取我的原始数据文件
data example;
Length
Address_1 ;
Format
ADDRESS_1 $CHAR40.;
Informat
ADDRESS_1 $CHAR40.;
infile "test_data.txt"
LRECL=226
ENCODING="LATIN1"
TERMSTR=CRLF
DLM='7F'x
MISSOVER
DSD ;
Input
ADDRESS_1 : $CHAR40.;
run;
显示你的数据线。
包含定界符或引号的值应该用引号引起来。因此,如果 address_1
的值是 'S example,
那么在分隔文件中它应该表示为
"'S example,"
或
'''S example,'
INFILE
语句中的 DSD
选项将相邻的定界符识别为指示缺失值,也会从引用值周围删除引号。
您可能遇到了与 SAS Communities 上的这份报告中类似的错误。 https://communities.sas.com/t5/Base-SAS-Programming/Importing-delimited-file-with-text-qualifiers/m-p/449215#M113034
在这种情况下,可以使用 scan()
函数和 m
修饰符而不是 q
修饰符从数据行解析值。
您也可以尝试 pre-processing _INFILE_
变量将裸单引号转换为 "'"
。这是一个简单的例子。
data test2 ;
length var1-var5 ;
infile cards dsd dlm='|' truncover firstobs=2;
input @;
_infile_=tranwrd(cats('|',_infile_,'|'),"|'|","|""'""|");
_infile_=substrn(_infile_,2,length(_infile_)-2);
input var1-var5 ;
cards4;
ID|Address_1|Address_2|Address_3|Email
2534|'S Road,||'|email2@GMAIL.COM
;;;;