CSV 数据被 SAS 截断
CSV data got truncated by SAS
我正在使用 SAS 大学版 9.4
这是我的 CSV 数据。
,MGAAAAAAAA,3,A0000B 2F1
11111,ハアン12222234222B56122,4,AA 0000
,テストデータ,5,AACHY 2410F1
,テストデタテストテ,5,AACHYF2
这是我的 infile 语句。
data wk01;
infile '/folders/myfolders/data/test_csv.txt'
dsd delimiter=','
lrecl=1000 missover firstobs=1;
input firstcol :$ secondcol :$ thirdcol :$ therest :$;
run ;
我期待这样的结果。
但是执行SAS后,我得到的结果如下(黄色高亮表示哪个row/column的数据被SAS截断了)
例如,第一行的第二列是 MGAAAAAAAA
但 SAS 的输出是 MGAAAAAA
你能指出我在这里遗漏了什么吗?非常感谢。
我认为你遇到的是混合编码问题。本质上发生的是,在 ASCII 的前 5 个字符之后,它变为 UTF8。逗号在这个汤中混淆了,你的标准分隔符在这里有点混乱。我认为您需要像这样的一些手动编码来处理它:
data wk01;
infile "test.csv" lrecl=1000 truncover firstobs=1;
input text $utf8x70.;
firstcomma = findc(text,',', 1);
secondcomma = findc(text,',', firstcomma + 1);
thirdcomma = findc(text,',', secondcomma + 1);
fourthcomma = findc(text,',', thirdcomma + 1);
length firstcol ;
length secondcol ;
length thirdcol ;
length fourthcol ;
firstcol= substr(text,1, firstcomma - 1);
secondcol = substr(text, firstcomma + 1, (secondcomma -firstcomma-1 ));
thirdcol = substr(text, secondcomma + 1, (thirdcomma - secondcomma - 1));
fourthcol = substr(text, thirdcomma + 1);
run;
可能有更简洁的方法,但这是我在凌晨 2 点想出的又快又脏的方法:)
您的变量值超过了允许的 8 个字节。每个 UTF-8 字符最多可以使用 4 个字节。看起来其中一些在中间被截断了,所以你得到了一个无效的 UTF-8 代码。
只需为变量定义更长的长度,而不是让 SAS 使用默认长度 8。通常,最好使用 LENGTH 或 ATTRIB 语句显式定义变量。而不是强制 SAS 根据您在其他语句(如 INPUT、FORMAT、INFORMAT 或赋值)中首次使用它们的方式来猜测如何定义它们。
data wk01;
infile '/folders/myfolders/data/test_csv.txt' dsd dlm=',' truncover ;
length firstcol secondcol thirdcol therest 0;
input firstcol secondcol thirdcol therest;
run ;
我正在使用 SAS 大学版 9.4
这是我的 CSV 数据。
,MGAAAAAAAA,3,A0000B 2F1
11111,ハアン12222234222B56122,4,AA 0000
,テストデータ,5,AACHY 2410F1
,テストデタテストテ,5,AACHYF2
这是我的 infile 语句。
data wk01;
infile '/folders/myfolders/data/test_csv.txt'
dsd delimiter=','
lrecl=1000 missover firstobs=1;
input firstcol :$ secondcol :$ thirdcol :$ therest :$;
run ;
我期待这样的结果。
但是执行SAS后,我得到的结果如下(黄色高亮表示哪个row/column的数据被SAS截断了)
例如,第一行的第二列是 MGAAAAAAAA
但 SAS 的输出是 MGAAAAAA
你能指出我在这里遗漏了什么吗?非常感谢。
我认为你遇到的是混合编码问题。本质上发生的是,在 ASCII 的前 5 个字符之后,它变为 UTF8。逗号在这个汤中混淆了,你的标准分隔符在这里有点混乱。我认为您需要像这样的一些手动编码来处理它:
data wk01;
infile "test.csv" lrecl=1000 truncover firstobs=1;
input text $utf8x70.;
firstcomma = findc(text,',', 1);
secondcomma = findc(text,',', firstcomma + 1);
thirdcomma = findc(text,',', secondcomma + 1);
fourthcomma = findc(text,',', thirdcomma + 1);
length firstcol ;
length secondcol ;
length thirdcol ;
length fourthcol ;
firstcol= substr(text,1, firstcomma - 1);
secondcol = substr(text, firstcomma + 1, (secondcomma -firstcomma-1 ));
thirdcol = substr(text, secondcomma + 1, (thirdcomma - secondcomma - 1));
fourthcol = substr(text, thirdcomma + 1);
run;
可能有更简洁的方法,但这是我在凌晨 2 点想出的又快又脏的方法:)
您的变量值超过了允许的 8 个字节。每个 UTF-8 字符最多可以使用 4 个字节。看起来其中一些在中间被截断了,所以你得到了一个无效的 UTF-8 代码。
只需为变量定义更长的长度,而不是让 SAS 使用默认长度 8。通常,最好使用 LENGTH 或 ATTRIB 语句显式定义变量。而不是强制 SAS 根据您在其他语句(如 INPUT、FORMAT、INFORMAT 或赋值)中首次使用它们的方式来猜测如何定义它们。
data wk01;
infile '/folders/myfolders/data/test_csv.txt' dsd dlm=',' truncover ;
length firstcol secondcol thirdcol therest 0;
input firstcol secondcol thirdcol therest;
run ;