miller - 是否有米勒函数可以将格式化为货币的 csv 数字识别为数字而不是字符串?
问题描述
我最近发现了用于批处理 csv 文件的 Miller (mlr) 并喜欢它,但似乎原始数据中格式化为货币的数字被 Miller 识别为字符串,因此尝试对它们执行数学函数会返回错误。
这是一个虚拟示例:
mlr --csv --opprint put '$total=$amt+$tax1+$tax2' data.csv
返回:
name amt tax1 tax2 total
producta $50.00 $2.50 $4.50 (error)
productb $60.00 $3.00 $5.40 (error)
productc $70.00 $3.50 $6.30 (error)
productd $80.00 $4.00 $7.20 (error)
producte $90.00 $4.50 $8.10 (error)
我发现最好的解决方法是在每个单独的列上使用 ssub 来删除美元符号,然后我可以将数据相加。
例子:
mlr --csv --opprint put '$amt=ssub($amt,"$","");$tax1=ssub($tax1,"$","");$tax2=ssub($tax2,"$","")' then put '$total=fmtnum($amt+$tax1+$tax2,"%3.2f")' data.csv
返回:
name amt tax1 tax2 total
producta 50.00 2.50 4.50 57.00
productb 60.00 3.00 5.40 68.40
productc 70.00 3.50 6.30 79.80
productd 80.00 4.00 7.20 91.20
producte 90.00 4.50 8.10 102.60
虽然这种解决方法是有效的,但它不是很有效。在具有很多列的 csv 文件中,这种方法需要大量的清理并且容易出错。有没有更好的方法让米勒将货币格式的数字识别为数字而不是文本?
解决方案
这是不可能的。
您可以使用全局搜索和替换
mlr --csv put -S ' 1 ↵
for (k in $*) {
$[k] = gsub($[k], "[$]", "");
}
' then merge-fields -k -a sum -r '(amt|tax)' -o out input.csv
具有
+----------+-------+------+------+------------+
| name | amt | tax1 | tax2 | out_sum |
+----------+-------+------+------+------------+
| producta | 50.00 | 2.50 | 4.50 | 57.000000 |
| productb | 60.00 | 3.00 | 5.40 | 68.400000 |
| productc | 70.00 | 3.50 | 6.30 | 79.800000 |
| productd | 80.00 | 4.00 | 7.20 | 91.200000 |
| producte | 90.00 | 4.50 | 8.10 | 102.600000 |
+----------+-------+------+------+------------+
而且这种方式有很多列也不是问题
推荐阅读
- ios - XCTest 测试异步合并 @Publishers
- git - 从分支上的最后一次提交算起,如何在过去 3 个月内完成 Git 提交?
- php - 如何只为 Wordpress 中的 AJAX 调用增加 PHP set_time_limit?
- javascript - Firestore 中的权限被拒绝
- c# - access_token / id_token 没有角色信息,可以在令牌中添加其他信息而不是检查每个页面吗?
- arrays - 在 jq 中,`.my_array` 和 `.my_array[]` 有什么区别?
- android - 为什么颤振应用程序中的图像是从painting.dart而不是images.dart导入的?
- python - 在 selenium 驱动程序选项卡之间切换,无需等待当前请求的响应
- html - 我想使用 css 将盒子放置在彼此附近,中间有空格
- linux - libstdc++.so.6:在 Linux 上找不到版本“GLIBCXX_3.4.26”