Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SAS数据集作为文本文件导出到UNIX…带分隔符'~|~';_Unix_Sas - Fatal编程技术网

将SAS数据集作为文本文件导出到UNIX…带分隔符'~|~';

将SAS数据集作为文本文件导出到UNIX…带分隔符'~|~';,unix,sas,Unix,Sas,我正在尝试将上的SAS数据集作为文本文件导出到UNIX文件夹,分隔符为“~|~” Here is the code I'm using.... PROC EXPORT DATA=Exp_TXT OUTFILE="/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt" DBMS=DLM REPLACE; DELIMITER="~|~"; PUTNAMES=YES; RUN; 这是我在UNI

我正在尝试将上的SAS数据集作为文本文件导出到UNIX文件夹,分隔符为“~|~”

Here is the code I'm using....
PROC EXPORT DATA=Exp_TXT
         OUTFILE="/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt"
         DBMS=DLM REPLACE;
     DELIMITER="~|~";
     PUTNAMES=YES;
RUN;
这是我在UNIX上得到的输出…..数据中缺少部分分隔符,但在变量名中得到整个分隔符

Num~|~Name~|~Age
1~A~10
2~B~11
3~C~12
知道为什么我只在数据中得到部分分隔符吗

谢谢,
Sam.

我猜
PROC EXPORT
不支持使用多个字符分隔符。通常,列分隔符只是一个字符。因此,您可能需要编写自己的代码来实现这一点

PROC EXPORT
为分隔文件生成普通的旧SAS代码,然后执行。您应该在SAS日志中看到代码,从中可以获取代码并根据需要进行修改


请参阅我的答案,以获取可能对您有所帮助的SAS宏。您不能完全按照所写的那样使用它,但它可以帮助您创建一个满足您需要的版本。

该问题在SAS手册页面上的FILE语句中有所提及


然而,有一个新的语句(无论如何,在某些版本中)DLMSTR。不幸的是,您不能在PROC EXPORT中使用DLMSTR,但是如果您不能轻松地写出变量,您可以从PROC EXPORT生成日志并将其粘贴到程序中,然后将分隔符修改为DLMSTR。您甚至可以动态执行此操作—使用PROC PRINTTO生成一个包含日志的文件,然后读入该文件,解析行号和非代码,将分隔符更改为DLMSTR,并%包含代码。

既然您使用的是unix,为什么不使用unix工具来解决此问题

您可以使用X语句从sas程序调用unix命令:

导出后,使用sed修复文件

PROC EXPORT DATA=Exp_TXT
         OUTFILE="/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt"
         DBMS=DLM REPLACE;
     DELIMITER="~";
     PUTNAMES=YES;
RUN;

X sed 's/~/~|~/g' /fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt > /fbrms01/dev/projects/tadis003/Export_txt_OF_New_v2.txt ;
这可能需要根据您的unix进行调整,但这在AIX上是可行的。某些版本的sed可以使用-i标志进行在位编辑,这样就不必键入两次文件名


这是一个比大型宏更简单、更容易的单行解决方案。

系统中的某些组件可能没有多字符字段delim的概念。只是“|”有什么不对?祝你好运。我的用户有一个代码,可以将以“~| ~”作为分隔符的文本文件导入到他们的系统中……所以需要“|”对他们不起作用……你好,鲍勃,谢谢你的回复,你的代码帮了我很多。除此之外,如何使用动态变量名导出,例如,如果我有两个数据集具有相同数量的变量,但变量名不同…我如何获得它?提前谢谢…我刚刚修改了对另一个问题的回答。宏的新版本应该满足您的要求。我甚至在你的问题中展示了一个使用数据集和目标文件的示例。谢谢bob…你的更新完全满足了我的需要…我感谢你的帮助…今天学到了很多:)没问题,很乐意帮助。如果此答案有帮助并且满足您的需求,请“接受”它,这样它就不会再显示为“未回答”。欢迎来到StackOverflow!嗨,鲍勃,还有一个小问题…对你来说可能很小。我对宏不太熟悉,所以我想不出来…这是数据1 FL 03/12/86 Sam 3000代码运行输出后没有显示尾随空格。这是输出。1~ | ~FL~ | ~03/12/86~ | ~Sam~ | ~3000~ | ~nothin。例如,在第1个值为1之后,我得到尾随空格,因为该变量的长度为12…是否有任何方法获得以下输出(对于变量长度没有尾随空格)1~ | ~FL~ | ~03/12/86~ | ~Sam~ | ~3000~ | ~nothing
PROC EXPORT DATA=Exp_TXT
         OUTFILE="/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt"
         DBMS=DLM REPLACE;
     DELIMITER="~";
     PUTNAMES=YES;
RUN;

X sed 's/~/~|~/g' /fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt > /fbrms01/dev/projects/tadis003/Export_txt_OF_New_v2.txt ;