我遇到的问题是,当我导入我的CSV文件时,我最终获得了大尺寸的临时文件(比输入文件本身大得多).当对其中一些文件使用压缩时,我的空间减少了99%,但我想知道是否有更好的方法可以直接减小尺寸.我准备了一个简化的例子.我正在导入如下的CSV:
FILENAME CSVFILE("c:\example.csv");
DATA CSVINPUT (COMPRESS=yes REUSE=yes);
INFILE CSVFILE DSD DLM ="," lrecl=15000;
INFORMAT multiplier 3.0;
INFORMAT A $char1000. ;
INFORMAT B $char2000. ;
INFORMAT C $char2000. ;
INFORMAT D $char1000. ;
INFORMAT E $char5000. ;
INFORMAT F $char4000. ;
INPUT multiplier
A $
B $
C $
D $
E $
F $ ;
RUN;
Run Code Online (Sandbox Code Playgroud)
CSV具有不同宽度的数据,列A可以有5个字符,或者可以有1000个字符.与其他列类似.此外,这些列中的一些可能具有嵌入的空格.我不确定它是否对问题有帮助,但乘数决定了这些列的大小.以下是CSV数据文件格式的示例:
4,aaaa,bbbbbbbb, cc ,dddd,eeeeeeeeeeeeeeeeeeee,ffffffffffff
1,a,bb, ,d,eeeee,ffff
2,aa,bbbb,cc ,eeeeeeeeee,ffffffff
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以更有效地导入这些数据,而不会截断任何值(或空格,例如C列)?这似乎是一个常见/简单的修复问题,但我还没有找到一个可行的解决方案,所以任何正确方向的帮助将不胜感激!
SAS是一个固定宽度的数据库系统; 它没有varchar像大多数SQL实现那样的概念.这意味着对于任何给定的SAS数据集,列具有固定的宽度(分配给它的存储字节数).如果您希望有时在列(变量)中包含1或2个字符,有时需要1500个字符,则必须为列分配1500并处理废物.它使SAS更快地访问数据(因为它是可预测的扇区数),但如果您的数据结构如上所述,则会浪费相当多的空间.
OPTIONS COMPRESS=CHAR是处理这个问题的正确方法,因为它会压缩数据并删除浪费的空间.除了以某种方式重构您的数据以避免列有大量浪费空间之外,这是您唯一真正的选择.