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 ;