【问题标题】:How to deal with single quotes and untranslatable characters如何处理单引号和不可翻译的字符
【发布时间】:2014-05-21 09:05:10
【问题描述】:

我的 SAS 表包含一个包含句子的文本列。其中一些句子包含单引号,例如 don't , space's . . 。每当我尝试将此表上传到 teradata 时,它都会引发错误 string contains untranslatable characters

当我手动删除' 时,它可以正常上传。

如何以原文方式正确上传原文?


我怀疑这不是普通的单引号

我试过了

varName = tranwrd(varName, "'",""); /* i also tried using ` instead of '  */

varName = translate(varName, "","'"); /* i also tried using ` instead of '  */

但字符串没有改变

【问题讨论】:

    标签: sas teradata


    【解决方案1】:

    请原谅,我不知道 teradata,但如果它与 sql 一样有问题。将您的文本从类似的东西转换为

    'don't'
    

    'don''t'
    

    这可能会有所帮助

    【讨论】:

    • 这是个好建议,但如果translate 没有删除它,那可能不是问题(假设它已正确实施)。
    【解决方案2】:

    一种可能性:与其手动删除,不如将其“剪切”,然后将其粘贴到 SAS 中,而不是键入 ' 或 ` 字符。

    更一般地,您可以通过查看角色的$HEX. 版本来识别角色的实际情况。

    一个好的方法是首先删除已知的“好”字符。

    data want;
    set have;
    step1 = compress(yourvar,,'ns');
    put step1= $HEX.;
    run;
    

    删除(英文)字母和数字、下划线和空格类型字符(空格、制表符等)。这应该将您的字符串减少到相对较少的字符数;如果您想进一步限制它,请将字符添加到(当前缺少的)第二个参数。

    现在,您可以查看十六进制输出并识别字符是什么,希望相当容易。每 2 个十六进制字符映射到一个 ASCII 字符,除非您在 Unicode 环境中,情况可能并非如此(可能是 2 个,可能多达 8 个)。您应该能够看到“坏”角色。找到它后,您可以使用'##'x 构造一个与其相同的字符,并使用compress 将其删除(compress 可以更有效地完成您尝试使用translate 执行的操作)。 IE,如果你有'0A'x(换行),你可以使用

    data want;
    set have;
    fixed=compress(yourvar,'0A'x);
    run;
    

    删除不需要的换行符。

    【讨论】:

    • 谢谢。如何删除所有 untranslatable 字符?是myVar = tranwrd(myVar , compress(myVar ,,'ns'), "")
    • compress 删除字符,你不需要trananything。然而,什么是不可翻译的字符很难定义。查看您的数据,看看里面有什么。
    • 这是一个 ' 。它看起来与所有其他 ' 完全一样。当我使用tranwrd 时,它适用于除此之外的所有观察。
    • 阅读我的答案并实施。然后回来告诉我们什么十六进制代码映射到明显的撇号。与幕后的东西相比,屏幕上的东西并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多