【问题标题】:SAS: Change encoding in proc importSAS:在过程导入中更改编码
【发布时间】:2019-09-12 22:46:50
【问题描述】:

我已经从 xlsx 文件中导入 proc,其中列名是波兰语。

我的简单过程如下所示:

proc import datafile = '/directory/file_name.XLSX'

 out  = libname.tablename
 dbms  =  xlsx
 replace;

run;

我想在某处添加 ENCODING="LATIN2",这样列就不会像这样:

有可能吗?怎么做?

我可以在第二步中用一些预定义的列表重命名所有列。但我还不想这样做。也许有更好的解决方案。

【问题讨论】:

  • XLSX 表格第一行的实际字符是什么? proc import 创建的名称中字符的十六进制代码是什么?它们是相同的字节还是 SAS 对它们进行了转码?

标签: sas


【解决方案1】:

这里发生了一些事情:

  1. 无法控制XLSX格式文件的编码;那是一个二进制文件(有点),SAS不会将它视为文本文件。您可以对 CSV 执行此操作,因为它是作为文本文件读入的,而不是 XLSX。
  2. 如果您要将其他编码的文件导入 SAS,您的会话编码也很重要。您必须以正确的编码运行您的 SAS 会话才能使一切看起来正确。有关如何更改 SAS 会话编码的更多详细信息,请参阅 the documentation

但是,如果您只是想去掉多余的字符,这里还有第三种选择:options validvarname=v7(甚至是v6)。我相信这将阻止 SAS 的导入引擎使用 A-Z 0-9 和下划线以外的任何字符。不过,它不一定看起来很漂亮,它会用我怀疑的下划线替换所有其他字符。

【讨论】:

    【解决方案2】:

    您需要指定正在读取/导入的文件的编码。

    根据SAS support,这可以在文件名语句中指定。

    我已经使用 SAS UE 和 csv 文件对其进行了测试,效果很好:

    filename temp '/folders/myfolders/Raw data/iso8859.csv' encoding="utf-8";
    
    proc import datafile = temp
    
     out  = utf8
     dbms  =  csv
     replace;
    
    run;
    

    您的代码应如下所示:

    filename temp '/directory/file_name.XLSX' encoding="LATIN2";
    
    proc import datafile = temp
    
     out  = libname.tablename
     dbms  =  xlsx
     replace;
    
    run;
    

    【讨论】:

    • 我完全按照你上面所说的做了,但是没有用。我想知道这是否不是这篇文章中的许可证问题:stackoverflow.com/questions/25723171/…
    • 嗯,看来你可以,因为显然你可以导入一些东西。如果您的 SAS 安装没有访问 PC 文件的权限,那么您将一无所获。您可以通过proc setinit; run; 查询。 SAS 日志说什么?并且导入是否适用于奇怪的字符,还是会失败?
    • 您想查看日志的哪一部分? Version: 9.04.01M5P091317Operating system: LIN X64 .。该代码有效,它使用一些有趣的字符导入列和数据。
    • 也许LATIN2 是windows 而不是linux enoding?
    • 我对可能发生的事情有所了解。文件从 windows 位置移动到 linux 位置(通过映射驱动器)。 SAS 位于 Linux 上。 linux 可能有不同的编码,它会产生有趣的字符。 SAS 只是导入它们已经错了。我将尝试直接在 linux 服务器上用记事本打开那个 .csv 文件,看看它的样子。我将发布我发现的内容。
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2019-09-26
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多