ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Miller 特殊符号与格式化处理实战:逗号、引号、正则转义与字符编码

Miller 特殊符号与格式化处理实战:逗号、引号、正则转义与字符编码 CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载本篇指南聚焦 Miller 在处理特殊符号时的完整套路数据中的逗号如何在不同文件格式间安全流转、字段名含.:/等符号如何引用、字符串中的单引号如何写入 DSL 表达式、正则中的?等元字符如何免转义替换以及 Latin-1 与 UTF-8 编码如何双向转换。读完你可以在 CSV、DKVP、XTAB、JSON 之间自由切换且不丢数据并掌握ssub/gssub/latin1_to_utf8/utf8_to_latin1等函数与latin1-to-utf8/utf8-to-latin1动词的底层原理。数据中的逗号各格式的天然处理差异Miller 对数据本身含逗号的处理能力取决于输出格式CSV 与 JSON 天生支持而 DKVP 与 NIDX 等以逗号作字段分隔符的格式则没有 CSV 式的双引号转义机制至少在 Miller 5.4.0 以来的行为如此需要换分隔符或换格式。先看 CSV 的设计内处理——用双引号包裹即可。样例文件 commas.csv$ cat docs/src/commas.csv Name,Role Xiao, Lin,administrator Khavari, Darius,tester同样的数据转成 JSON逗号作为字符串内容被 JSON 引号原样保留--icsv读入 CSV--ojson输出 JSON$ mlr --icsv --ojson cat docs/src/commas.csv [ { Name: Xiao, Lin, Role: administrator }, { Name: Khavari, Darius, Role: tester } ]Miller 的 XTAB垂直表格式 不支持回车换行的转义但逗号完全没有问题输出可读性也不错$ mlr --icsv --oxtab cat docs/src/commas.csv Name Xiao, Lin Role administrator Name Khavari, Darius Role tester但对 DKVPkey-value-pairs 和 NIDXindex-numbered 这类逗号即字段分隔符的格式而言情况就不同了——逗号在数据里会被当成分隔符$ mlr --icsv --odkvp cat docs/src/commas.csv NameXiao, Lin,Roleadministrator NameKhavari, Darius,Roletester三种应对策略策略一换分隔符。用--ofs指定别的输出字段分隔符例如管道符|$ mlr --icsv --odkvp --ofs pipe cat docs/src/commas.csv NameXiao, Lin|Roleadministrator NameKhavari, Darius|Roletester策略二换格式。DKVPX 格式--dkvpx支持 CSV 式的引号转义键值可以原生包含逗号、等号、换行和引号$ echo a,bx,y,z3 | mlr --dkvpx cat a,bx,y,z3策略三用控制字符当分隔符。想彻底避免数据与分隔符冲突可以使用控制字符——比如 ASCII 控制符\001Ctrl-A。配合cat -v可见^A$ mlr --icsv --odkvp --ofs \001 cat docs/src/commas.csv | cat -v NameXiao, Lin^ARoleadministrator NameKhavari, Darius^ARoletester含特殊符号的字段名花括号引用当字段名本身含有.、:、/等符号时这类名字在 DKVP 输入里很常见DSL 中用花括号{}把整个字段名包起来即可正常读写。例如输入字段名为x.a、y:b、z/c想生成新字段product.all$ echo x.a3,y:b4,z/c5 | mlr put ${product.all} ${x.a} * ${y:b} * ${z/c} x.a3,y:b4,z/c5,product.all60花括号内的点号、冒号、斜杠都会被当作字段名的一部分而不是路径分隔或运算符。这也解释了为什么含标点符号的字段名在 Miller DSL 中无需重命名就能直接参与运算。字符串中的单引号DSL 双引号 Shell 引号拆解Miller DSL 中字符串统一使用双引号因此字符串里放单引号毫无压力真正的麻烦来自 shell 的引号处理。最稳妥的做法是把更新脚本写进文件如 data/single-quote-example.mlr本仓库 docs 源中对应 special-symbols-and-formatting.md 的示例再用-f加载$ echo abcd | mlr put -f docs/src/data/single-quote-example.mlr aIts OK, I said, then for now.脚本内容只有一行$a Its OK, I said, then for now.如果一定要在命令行内联就必须手工拆解 shell 引号——外层单引号用来保护put表达式不被 shell 展开中间需要出现的单引号得跳出外层单引号用\拼接$ echo abcd | mlr put $aIt\s OK, I said, \for now\. aIts OK, I said, for now.拼接的七个片段分别是$aIt\s OK, I said,\for now\.。换句话说\在 shell 眼中 结束单引号 转义单引号 重新开始单引号最终把字面传进 Miller。这正是把脚本放进文件更省心的原因。正则元字符的转义[?]与ssub/gssub两条路处理?、.、*这类正则元字符时可以用方括号把字符去特殊化也可以干脆放弃正则、改用纯字符串替换。样例文件 docs/src/data/question.dat即ais it?,bit is!方式一正则 字符类。gsub中把?写成[?]$ mlr --oxtab put $c gsub($a, [?], ...) docs/src/data/question.dat a is it? b it is! c is it ...方式二纯字符串替换。ssub替换第一处完全不解释正则、不做转义$ mlr --oxtab put $c ssub($a, ?, ...) docs/src/data/question.dat a is it? b it is! c is it ...源码层面ssub与gssub在 pkg/bifs/regex.go 中共享bif_ssub_gssub实现底层是 Go 标准库strings.Replace/strings.ReplaceAll——注释明确写着 no-frills string-replace, no regexes, no escape sequences。这解释了为什么 参考文档 强调这两个函数存在就是为了让你什么都不用转义ssub只替换首个匹配gssub全局替换。Latin-1 与 UTF-8 编码转换Go 的regexp库Miller 的正则引擎要求字符串必须是 UTF-8因此处理 Latin-1即 ISO/IEC 8859-1文本时ssub/gssub这类纯字符串操作反而比sub/gsub更合适。典型场景是字节级转码把字符串里的\xf0、\xed、\xde等单字节序列逐个替换成对应的 Unicode 码点\u00f0、\u00ed、\u00de$ mlr -n put end { name Ka\xf0l\xedn og \xdeormundr; name gssub(name, \xde, \u00de); name gssub(name, \xf0, \u00f0); name gssub(name, \xed, \u00ed); print name; } Kaðlín og Þormundr不过更系统的做法是使用专门的内置能力DSL 函数latin1_to_utf8与utf8_to_latin1字段级粒度动词latin1-to-utf8与utf8-to-latin1全记录处理更少按键。两者的实现都在 pkg/bifs/strings.go转码失败例如把西里尔字母从 UTF-8 转回 Latin-1时返回错误值而非静默破坏数据底层字节级转换逻辑见 pkg/lib/latin1.go。动词侧的latin1-to-utf8定义于 pkg/transformers/latin1_to_utf8.go其使用帮助还提示需要字段级控制请看latin1_to_utf8DSL 函数。下面两张截图展示了真实运行结果。第一张是各输入都能从 Latin-1 转成 UTF-8因为 Latin-1 本身包含德文字符第二张中英文与德文全字母句可以从 UTF-8 转回 Latin-1但俄文不行——Latin-1 不含俄文字母表对正则捕获组做数学运算正则匹配得到的捕获组都是字符串要参与计算必须先显式转型为int或float。经典场景是度分转十进制度数用圆括号写捕获组用\1、\2引用再float()转换后运算$ echo a14°45 | mlr put $a ~^([0-9])°([0-9]) {$degrees float(\1) float(\2) / 60} a14°45,degrees14.75这里\1捕获14、\2捕获45float(\1)得到 14.045/60得 0.75合起来 14.75。关于捕获组、\1-\9引用及正则匹配的更多细节可参考 正则表达式专题文档 与 DSL 内置函数参考。小结问题推荐方案关键命令/函数数据含逗号输出 DKVP/NIDX换分隔符 / 换 DKVPX / 用控制符--ofs pipe、--dkvpx、--ofs \001字段名含.:/等符号花括号包住字段名mlr put ${field.name} ...字符串里要放单引号脚本文件 DSL 双引号内联则拆 shell 引号mlr put -f file.mlr正则元字符想免转义纯字符串替换ssub/gssubLatin-1 与 UTF-8 互转字段级函数或全记录动词latin1_to_utf8/latin1-to-utf8等对正则捕获做数学运算捕获组 显式转型float(\1) float(\2) / 60以上所有示例均可在当前仓库内验证样例输入见 docs/src/commas.csv 与 docs/src/data/question.dat实现证据见 pkg/bifs/regex.go、pkg/bifs/strings.go 与 pkg/transformers/latin1_to_utf8.go。赞分享CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载相关推荐Yesod认证系统完全指南从基础认证到OAuth集成Yesod认证系统完全指南从基础认证到OAuth集成 Yesod认证系统是Haskell Web框架Yesod的核心组件提供了完整的用户身份验证解决方案。本learn-regex转义字符正确处理特殊符号的终极指南learn regex转义字符正确处理特殊符号的终极指南 正则表达式是一种强大的文本处理工具但特殊符号的处理常常让新手感到困惑。 learn regex 项教程学习正则表达式表情符号Emoji和特殊符号的完整处理指南学习正则表达式表情符号Emoji和特殊符号的完整处理指南 正则表达式是处理文本的强大工具但在面对表情符号和特殊符号时很多开发者都会感到困惑。 本文将为教程上一篇R3nzSkin国服换肤工具免费解锁英雄联盟所有皮肤的秘密武器下一篇3分钟为Windows 11 LTSC系统安装Microsoft Store的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表