SAS Proc 导入列用引号引起来的 csv 文件
SAS Proc Import csv file with columns enclosed in quotation marks
我有一个特别的问题。我已经导出了一个 csv 文件,在某些列中,由于前导零,我需要将数据放在引号中,有时在导出时长数据编号包含 "E"。现在我试图将同一个文件导入 SAS 以查看我的 proc 导入例程是否有效。
当我导入文件时,所有数据都通过了,但在我实际导出 20 列时被压缩成两列(因此我的定界符错误?)。
并非所有列都用引号括起来,只有几个列。数据示例:
CustomerID CustomerName Product Price BillingNR
"01234" Customer 1 Product1 Price1 "03541"
"52465" Customer 2 Product2 Price2 ""
"23454" Customer 3 Product3 Price3 "035411236952154589632154"
然后将 CustomerID 和 BillingNR 括在引号中。
当只有一些列用引号引起来而其他列没有引起时,如何导入此数据集? 或者简单地从导入时删除所有双引号?这是我的代码:
%macro import;
%if &exist= "Yes" %then %do;
proc import
datafile= "\mypath\data.csv"
DBMS=CSV
out=Sales
replace;
getnames=YES;
run;
%end;
%else %do;
%put Nothing happens;
%end;
%mend;
%lesInn;
IF/ELSE-test 只是我测试指定文件是否存在的另一个宏。我尝试研究不同的方法,并且仍在寻找类似的问题,但似乎没有任何效果。
非常感谢所有答案。
图尔
CSV -> 逗号分隔值
我没有看到逗号被用作您的分隔符,而是管道。
将分隔符指定为竖线,并将 GUESSINGROWS 选项增加到一个较大的数字,以便它分配正确的长度和类型。
Proc import ... DBMS = DLM Replace;
Delimiter='|';
GuessingRows=10000;
....remaining options;
Run;
我仍然不确定 Proc Import 是否有效。如果不是,您将需要编写数据步骤代码并确保指定将处理引号的 DSD 选项。
编辑:根据问题编辑,最准确的方法是通过数据步骤阅读。如前所述,DSD 选项将处理报价。
如果您使用 DSD 选项读取文件,则 SAS 会自动删除值周围的引号。甚至不需要引用的值周围的引号,就像您的大多数示例数据一样。
data want ;
infile cards dsd truncover firstobs=2;
length CustomerID CustomerName Product Price BillingNR ;
input CustomerID -- BillingNR ;
cards;
CustomerID,CustomerName,Product,Price,BillingNR
"01234",Customer 1,Product1,Price1,"03541"
"52465",Customer 2,Product2,Price2,""
"23454",Customer 3,Product3,Price3,"035411236952154589632154"
;
将产生如下值:
我有一个特别的问题。我已经导出了一个 csv 文件,在某些列中,由于前导零,我需要将数据放在引号中,有时在导出时长数据编号包含 "E"。现在我试图将同一个文件导入 SAS 以查看我的 proc 导入例程是否有效。
当我导入文件时,所有数据都通过了,但在我实际导出 20 列时被压缩成两列(因此我的定界符错误?)。
并非所有列都用引号括起来,只有几个列。数据示例:
CustomerID CustomerName Product Price BillingNR
"01234" Customer 1 Product1 Price1 "03541"
"52465" Customer 2 Product2 Price2 ""
"23454" Customer 3 Product3 Price3 "035411236952154589632154"
然后将 CustomerID 和 BillingNR 括在引号中。
当只有一些列用引号引起来而其他列没有引起时,如何导入此数据集? 或者简单地从导入时删除所有双引号?这是我的代码:
%macro import;
%if &exist= "Yes" %then %do;
proc import
datafile= "\mypath\data.csv"
DBMS=CSV
out=Sales
replace;
getnames=YES;
run;
%end;
%else %do;
%put Nothing happens;
%end;
%mend;
%lesInn;
IF/ELSE-test 只是我测试指定文件是否存在的另一个宏。我尝试研究不同的方法,并且仍在寻找类似的问题,但似乎没有任何效果。
非常感谢所有答案。
图尔
CSV -> 逗号分隔值 我没有看到逗号被用作您的分隔符,而是管道。
将分隔符指定为竖线,并将 GUESSINGROWS 选项增加到一个较大的数字,以便它分配正确的长度和类型。
Proc import ... DBMS = DLM Replace;
Delimiter='|';
GuessingRows=10000;
....remaining options;
Run;
我仍然不确定 Proc Import 是否有效。如果不是,您将需要编写数据步骤代码并确保指定将处理引号的 DSD 选项。
编辑:根据问题编辑,最准确的方法是通过数据步骤阅读。如前所述,DSD 选项将处理报价。
如果您使用 DSD 选项读取文件,则 SAS 会自动删除值周围的引号。甚至不需要引用的值周围的引号,就像您的大多数示例数据一样。
data want ;
infile cards dsd truncover firstobs=2;
length CustomerID CustomerName Product Price BillingNR ;
input CustomerID -- BillingNR ;
cards;
CustomerID,CustomerName,Product,Price,BillingNR
"01234",Customer 1,Product1,Price1,"03541"
"52465",Customer 2,Product2,Price2,""
"23454",Customer 3,Product3,Price3,"035411236952154589632154"
;
将产生如下值: