syntax - SAS 关于连接运算符的一些问题 ||
问题描述
我对 SAS 中的以下程序有疑问。
data staff;
jobA='FA';
jobB='1';
jobA=jobA||jobB;
run;
proc print;
run;
为什么jobA的输出还是FA?
我认为它应该更新,但由于某种原因它保持不变......它是否必须对首次定义时的 jobA 的原始长度做任何事情?
解决方案
DATA Step 字符变量不同于其他编码语言中的字符串变量。每个 DATA Step 变量都有一个固定的长度。可变长度可以是:
- 用
LENGTH
orATTRIBUTE
语句显式声明(在首次使用之前), - 通过 、 或 语句从贡献数据集
SET
“继承”MERGE
,UPDATE
MODIFY
- 或者从它们在数据步骤程序中的第一次使用中推断出来。
正如 Chris J 在他的评论中正确回答的那样,jobA
长度为 $2 因为它的第一次使用是上下文相关的,因为'FA'
它有两个字符。同样,jobB
长度为 1 美元。
对于您的具体问题,连接结果为 3 个字符长并存储在 2 个字符的变量中。当结果存储在变量中时,会发生静默(无日志消息)截断。
所有字符变量都隐含地用空格填充到它们的长度,这是连接时的一个重要考虑因素 - 有时在连接时你会挠头问,结果的其余部分在哪里?或者为什么有这么多空格在后续部分之前?
组合值时,连接运算符 ( ||
) 不会修剪尾随空格。当目标变量的长度不足以包含所有组合变量的长度时,这可能会导致混淆——连接似乎“没有发生”。在过去,编码模式trim(left(variable-1))||trim(left(variable-2))||..||trim(left(variable-n))
被用来避免这种情况。
今天的 SAS 有一系列连接函数(cat
, cats
, catt
, catx
, catq
),它们使组合字符表达式更容易一些。
考虑阅读 SAS 文档Step-by-Step Programming with Base SAS, Combining Character Values: Using Concatenation
推荐阅读
- java - 使用 Java (Minecraft),我如何计算和使用四元数来旋转一个单位向量以匹配另一个?
- c++ - clang 上的模棱两可的运算符重载
- ios - 对象的属性未在数组 SwiftUI 中更新
- python - Can't login with python post错误出现
- python - 成功运行 2 次后,命令需要 10 分钟才能运行
- r - 在 R 中创建 API 函数时在何处包含 OAuth
- r - 在 mutate() 函数中使用 lag() 的问题 (tidyverse)
- python - 如何在不干扰用户文本输入的情况下使用输入?上下文:基于套接字的聊天 - Python 3.9
- postgresql - PSQL - encrypt_iv 返回多行编码文本
- python - 数据框在文本上选择一个单词