sas - 将字符“小数”(逗号分隔符)和字符“整数”格式化为数字“小数”(点分隔符)
问题描述
这与我最近的另一个问题有些相关。
设置我正在读取 1 或 2,0 或 10,0 或 2,5 类型的字符变量。我想使用小数点而不是逗号将它们转换为数字。所以理想情况下,我想得到以下结果:
1 -> 1
2,0 -> 2
10,0 -> 10
2,5 -> 2.5
我的代码
data _null_;
test='5,0';
result=input(test_point,comma10.1);
put 'this should be:' result;
run;
对所有类型为'xy,z'的字符变量执行此操作,但对于'xy'失败,根本没有逗号分隔。在这里我会得到
xy -> x,y
我正在考虑添加一个 if/else 来检查字符串的长度是否为 1 或更大。所以像
data _null_;
test='5';
if length(test)=1 then result=input(test, comma10.);
else result=input(test, comma10.1);
put 'this should be:' result;
run;
但这里的问题是
10 -> 1
像 10,00(应该是 10)变成 100 的问题可能可以通过用 '.' 替换 ',' 来解决,但是没有小数分隔符的字符仍然是一个问题。
有什么聪明的解决办法吗?
我的解决方案有点hacky(基本上只使用逗号引入长度> 2的事实 - 例如123的问题仍然会出现):
data _null_;
t='5,5';
test=tranwrd(t, ',', '.');
if length(test)=1 or length(test)=2 then result=input(test, comma10.);
else result=input(test, comma10.1);
put 'this should be:' result;
run;
解决方案
听起来您的文本字符串是在数字中逗号和句点的正常含义被颠倒的地方创建的。因此,他们没有使用句点表示小数点,而使用逗号表示千位分组,而是颠倒了含义。
对于那种类型的字符串,SAS 有COMMAX
信息。
通常,您不想在您的信息中添加十进制规范。仅当源字符串没有明确的小数点时才使用信息的小数部分。基本上,它告诉 SAS 将没有明确小数点的值除以 10 的信息规范中小数位数的幂。它旨在读取故意不写入小数点的数据以节省空间。
几乎所有的COMMA
信息都是去掉逗号和美元符号的字符串,然后使用普通的数字信息读取它。
该COMMAX
信息将理解逗号和句点的相反含义。所以它几乎消除了句点,然后将逗号转换为句点,然后使用正常的数字信息读取它。
试试你自己的小测试。
data check;
input @1 string $32. @1 num ??32. @1 comma ??comma32. @1 commax ??commax32.
@1 d2num ??32.2 @1 d2comma ??comma32.2 @1 d2commax ??commax32.2
;
cards;
123
123.4
123,4
1,234.5
1.234,5
;
proc print;
run;
推荐阅读
- python - KivyMD 按下按钮时切换屏幕?
- python - 在 str.findall 之后将函数应用于 pandas 数据框列
- java - 找不到附近的 WiFi - Direct 设备,显示“未找到设备!”
- react-native - 无法在 Apollo 中更新我的片段?
- reactjs - 具有多个 ajax 响应的 RxJS Observable
- r - 我可以在 R 的列表中保存多个火炬张量吗?
- python - ON DUPLICATE KEY UPDATE 非索引列
- node.js - 请求通过 `request` 成功,但因 `axios` 失败
- sql - 在 SQL Server 2017 中合并
- java - Eclipse 有没有办法以与 unix (TeamCity) 构建主机相同的方式运行 Java 单元测试?org.junit.ComparisonFailure 问题