【问题标题】:SAS not able to merge two data sets by matching character variablesSAS 无法通过匹配字符变量来合并两个数据集
【发布时间】:2016-05-06 22:11:09
【问题描述】:

我有两个数据集,一个从 .xlsx 导入,一个从 .csv 导入。我确实扫描、修剪、大写和所有这些东西来清理这两个数据集。我尝试了 proc sql 和 data 步骤以通过字符变量将两者合并。 SAS 将无法找到任何匹配项。但是,当我将这两个数据集导出回 .xlsx 然后并排复制并粘贴这两个数据集的字符列时。显然有很多匹配项,Excel 也可以识别它们是相同的(使用 if 语句来检查它们)。

这里发生了什么?

谢谢!

【问题讨论】:

  • 最有可能是某种不可见字符,使用十六进制格式将一些匹配值放入日志中,看看它们是否不同。或者您的代码不正确 - 因为我们看不到它,所以我们只能猜测。在这些情况下,您需要能够发布示例数据 - 以十六进制格式输出 put 语句的结果至少是一个好的开始。现在我们没有太多事情要做。
  • 你在@Reeza 上是对的!十六进制格式表明它们是不同的。例如,一个是 4269726D696E6768616D2020202020,另一个是 204269726D696E6768616D20202020,但两者都显示“伯明翰”......好吧,我检查了 ascii 代码表,20 对应于空格。但我用过 trim()...谢谢!
  • 看起来您的值中有一个前导空格。您是否尝试过 COMPRESS() 函数?查看修饰符并选择删除不可打印字符的修饰符,我想不起来了。
  • 谢谢@Reeza! Compress() 有效!
  • strip(compress(string,,'kw')) 将只保留可打印字符,然后删除所有前导和尾随空格。

标签: character-encoding sas


【解决方案1】:

您的变量中可能有导致问题的不可见字符。要查看这些,请以十六进制格式输出变量以查看差异。

您可以使用 COMPRESS() 函数去除任何不可见的字符。

【讨论】:

    【解决方案2】:

    很难调试变量值中是否存在前导空格。 PUT 语句的默认效果是删除它们。您需要使用 $CHAR。或 $VARYING。格式以保留前导空格。 $报价。格式也可以提供帮助。或者你可以用可打印的字符包围字符串,这样 PUT 就不会使用 QUOTE() 或 CAT() 函数删除前导空格。

    使用LEFT() 函数删除前导空格。

    您也可以使用STRIP() 函数来删除前导和尾随空格,但 SAS 比较不关心尾随空格。当您将值分配回字符变量时,尾随空格将再次出现,因为 SAS 字符变量是固定长度的,并且在右侧用空格填充。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多