如何用 Miller 按名称查找并更新 CSV 字段?
数据小陈
可以用 Miller 的 join 按 name-manufacturer 做左连接,再将查到的 ID 写入产品文件的 id-manufacturer 列。左连接会保留没有匹配到制造商的产品行;命令只在查到 ID 时覆盖原值,因此未匹配行仍保留 0。
假设两个文件的表头与问题中的示例一致,可以运行:
mlr --csv join --ul -j name-manufacturer --rprefix lookup_ -f manufacturer-feeder.csv then put 'if (is_present($lookup_id-manufacturer)) {$id-manufacturer = $lookup_id-manufacturer}' then cut -x -f lookup_id-manufacturer,lookup_name-manufacturer,lookup_link-rewrite,lookup_image-posted product-feeder.csv
-j name-manufacturer 指定匹配列,-f manufacturer-feeder.csv 将制造商文件用作查找表。--ul 会保留产品文件中未匹配的记录;--rprefix lookup_ 则为查找表字段添加前缀,避免与产品文件中的字段重名。put 只在找到 lookup_id-manufacturer 时更新原 ID,最后的 cut -x 会删除关联带入的辅助字段。
输出会保留产品文件原有的列。比如,MANUFACTURER ONE 对应的 ID 会更新为 114,MANUFACTURER TWO 会更新为 116;UNKOWN MANUFACTURER 没有匹配项,ID 仍为 0。
匹配依据是字段值,因此名称的拼写和空格都需要一致。如果 manufacturer-feeder.csv 中有多个相同的 name-manufacturer,一条产品记录可能匹配到多条结果。使用前应确保查找表中的名称唯一。该写法使用了 Miller 的 --rprefix、--ul 和 DSL is_present;如果本机版本不支持这些选项或函数,请查看对应版本的 Miller 帮助文档。
备注:内容仅供参考。
