【问题标题】:How to make SAS import a text file exactly as input, even with ; , "如何使 SAS 完全按照输入导入文本文件,即使使用 ; , "
【发布时间】:2017-05-29 14:52:50
【问题描述】:

首先,请原谅我缺乏技术英语。我会试着用一些图片来说明我的意思。

我正在尝试将文本文件“按原样”导入 SAS。它看起来像这样:

File sample

在文本中:

YPJC200,FG;00899;Pesos;0;3500;EDENOR S.A. "B" 1 VOTO
TRAD15.9FF;00902;Pesos;0;3000;EDENOR S.A. "B" 1 VOTO

这是一个用分号“;”分隔的文本文件但除此之外它还有:

  • 某些名称带有点“。”在其中(例如:TRAD15.9FF)
  • 某些名称中包含逗号“,”(例如:YPJC200,FG)
  • 列描述有双引号

我当然会遇到错误或列位移。

正如我之前所说,我想在一列中“按原样”导入完整文件,替换前三行(即错误的标题),在一行中替换为正确的,然后再次导出到文本文件。 所以我需要获取相同的文件,但标题已更改。

我在尝试其他事情后使用此代码:

DATA    WORK.WANT;
    INFILE '\\server\Interfaces\position.txt'
    DSD LRECL = 32767 MISSOVER DLM = '|';
    INFORMAT CAMPO $1500.;
    INPUT    CAMPO $;
    IF _N_ >= 6;
RUN;

与“INFORMAT CAMPO 1500 美元。;”我只在一列中加载文件。

我正在使用“ DLM = '|' " 避免使用分隔符。我不能设置除此之外的任何分隔符,因为我的文件包含所有分隔符 (; . , ) 当然除了管道。如果避免使用“DLM”选项,它会采用逗号分隔符,所以它是无用的。

但是现在我遇到了双引号的问题。

我到处都是这样的双引号:

"YPJC200,FG;00899;Pesos;0;3500;EDENOR S.A. ""B"" 1 VOTO"
"TRAD15.9FF;00902;Pesos;0;3000;EDENOR S.A. ""B"" 1 VOTO"

所以,直接的问题是: 如何以最简单的方式逐行、逐字符导入文件?

提前致谢

【问题讨论】:

  • 请将您的示例数据作为文本发布为您问题的一部分。你希望人们为你打出来吗?
  • 我现在添加。如果你看到它说“文件示例”是一个图像的链接,但是因为我有 8 个 Stackoverflow 的声誉,所以我没有让我粘贴到帖子中。图像具有列名,便于阅读,因为它有很多“分隔符”。

标签: text import sas delimiter


【解决方案1】:

如果您想将整行读入一个长字符变量,为什么要在 INFILE 语句中提及与分隔符有关的任何事情?如果您想保留前导空格,请使用$CHAR 信息。

data want ;
  infile '\\server\interfaces\position.txt' truncover firstobs=6;
  input campo $char1500.;
run;

【讨论】:

  • 如果避免使用“DLM”选项 SAS 假定逗号分隔符,所以它没有用,因为文件有逗号,我得到多列的输入。
  • 如果您不使用 DLM 或 DSD 选项,那么 SAS 会将空格作为分隔符并将多个分隔符视为一个。
【解决方案2】:

不要在你的 infile 语句中使用DSD。这将使 SAS 以不同于其他字符的方式处理引号字符,这是您不想在此处执行的操作。

此外,您可以将文件直接写入另一个具有固定标题的文本文件,而无需从中创建 SAS 数据集,例如

DATA _null_;
    INFILE '\\server\Interfaces\position.txt' LRECL = 32767 firstobs = 6;
    file "\\path\to\fixed\file.txt" ;
    INPUT;
    if _n_ = 1 then put "var1,var2,..."; /*insert fixed header row text here*/
    put _infile_;
RUN;

【讨论】:

  • 谢谢,删除 DSD 成功了。但是我在出口方面仍然遇到问题:我有这个:EDENOR;$;130;Especie;EDN;508;EDENOR S.A. "B" 1 VOTO;Especie 我得到了这个:"EDENOR;$;130;Especie; EDN;508;EDENOR S.A. ""B"" 1 VOTO;Especie" (检查额外的双引号,我不需要它们)
  • 我已经在导出时使用我发现的“数据/文件”导出解决了这个问题:数据 null;设置工作。有;文件“\\server\positionnew.txt;放坎波;运行;
猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2020-11-09
相关资源
最近更新 更多