这次搜索的多数结果是从 SAS 源码生成 Python 的工具,其中几个做得不错。这一页从更早一步开始:这次迁移对你的代码库究竟合不合适,验证结果要花多少代价,以及答案是否定时该怎么办。
从一个 SAS 代码库出去的路有四条,不是两条:交给自动工具、由人重写、在不是 SAS 的东西上原样运行 SAS 程序,或者什么都不动。哪条正确几乎只取决于两个问题——代码有多少,以及是否有人必须复现它从前的输出。下面写的就是每条路的代价。
Python 是更好的目的地,这种情况比这类页面通常承认的要多。四个条件让选择变得清楚:代码库小到一个人一周能读完,团队本来就每天写 Python,分析反正要重做,以及下游没有任何环节要求新数字和旧数字严格一致。四条都成立时,重写比任何兼容层都便宜,最后留下的是团队不用背第二种语言就能维护的代码。
这里的每个选项对某些人来说都是正确答案。没有一个是不付代价的,而贵的部分从来不是语法。
网页工具、厂商服务和大语言模型会接过 .sas 源码并返回 Python,通常把 DATA 步映射到 pandas,把常用过程映射到 statsmodels 或 scikit-learn。对几百行直白的数据处理,这是真正的捷径,几分钟就能拿到一个能读的起点。账单稍后才到:输出的每一行都需要一个同时懂两种语言的人去读。
有人读完 SAS 程序,弄清它本来要做什么,再用 Python 写出来。起步更慢,而且这是唯一一条最后得到的代码像 Python、而不像披着 Python 外衣的 SAS 的路。两年后仍然对 Python 满意的团队,大多是这样走过来的,通常让旧程序在旁边继续跑,直到数字对上。
对比页面跳过的那条路。Jenner 是 SAS 9.4 语言的净室实现,用 Rust 写成:它直接读取 SAS7BDAT 文件,按原样执行 .sas 源码,因此没有生成的代码需要复查,团队也不必多扛一种语言。它做不到的是覆盖整个 SAS 语言,覆盖范围逐个过程公开,你可以在依赖之前先查自己的那些。
什么都不做是一个真实的决定,而且常常是对的。如果代码稳定,运行它的环境今年不会消失,也没有人要求改变,那么你不做的这次迁移就是这一页上回报最高的选择。等平台搬迁、审计或者招人困难把这个问题逼到面前时,再回来看。
自动转换的失败方式不是语法错误,语法错误第一次运行就会露面。是那种安静的数值差异。SAS 用空格填补字符值的右端而 Python 不会;SAS 从 1960 年 1 月 1 日开始数日期,pandas 从 1970 年 1 月 1 日开始;DATA 步的 MERGE 在键于两侧重复时,行为也不同于 pandas 的 merge。这些都不会报任何东西。它给出的是一个几乎正确的数字,而这是最糟的一种错。所以真实的价格,是由同时精通两种语言的人逐行阅读,加上一段让新旧在同样输入上并排运行、直到输出一致的时间;这个价格随代码的数量增长,而不是随它的巧妙程度。