关于 rename 对缺失字段容错以及 import 列别名的问题

大佬们,过节好。🙏

相比较于去年风声鹤 li,挡板皆兵,能被 ju 委 hui、jie 道 ban 随意拿捏,行动不便的假期,今年的长假显得更随性自由,这些多亏了强大的祖国。那表哥表妹实现数据处理随性自由要靠谁,我觉得要靠强大的 SPL,但 SPL 也有一些限制,比如函数 rename 更改字段名时对缺失字段的处理没有容错,这也是一种限制。

函数 rename 更改已经存在的字段名没有问题,很直观,如下图所示:

imagepng

但是,如果涉及到了序表中不存在的字段名,SPL 会直接抛出错误,如下所示,在参数中增加一个 c:C,把不存在的小写 c 字段名改成大写 C 字段名,此时抛出”字段不存在“的错误:

imagepng

当然,这样报错肯定是没有问题的。我想说的是:

rename 能不能实现自由度更大一些的选项拓展?实现对缺失字段的容错处理。

依然用 Power Query(以下简称 PQ) 中具有类似功能的的 Table.RenameColumns 函数举例如下:

1、字段不存在时,依然保持报错,这是基本的功能。PQ 的 rename 函数多了一个处理 MissingField 的参数,在缺省或者指定为 MissingField.Error 时,会抛出错误:

imagepng

2、对不存在的字段实现容错忽略的处理,正常显示更改后的结果,如果没有更改就返回原序表。PQ 里用了 MissingField.Ignore 参数:

imagepng

3、对不存在的字段作为添加新列处理,列值用 null 填充。PQ 里用了 MissingField.UseNull 参数:

imagepng

上述第三点”对不存在的字段处理成添加列“,SPL 中的 alter 函数也有该功能,如下所示,在更改列顺序的同时,对不存在的 c 列作为添加列处理,并用 null 填充:

imagepng

=========================================================================

由此,引出另一个问题:

如何在读取文件的同时实现重新命名列别名,模拟 SQL 语句 "select a as A,b as B from table"

比如,主目录下有一个 test.xlsx 文件,有 4 个字段,字段名分别为 "客户名称",“状态”,“建筑面积”,“日期”,用 xlsimport 读取数据时,可以实现只获取其中的若干列,比如,只获取客户名称和建筑面积这两列:

imagepng

那能不能实现这样的写法,在获取列数据的同时可以命名列别名:

  • 1、file(“test.xlsx”).xlsimport@t(客户名称: 名称, 建筑面积: 面积)
  • 2、T(“test.xlsx”, 客户名称: 名称, 建筑面积: 面积)

相当于 "select 客户名称 as 名称, 建筑面积 as 面积 from test.xlsx"。
甚至于,在读取列的同时,不仅可以命名列别名,还能指定数据类型,比如,把参数写成 "原列名: 新列名: 数据类型"。import 方法在读取数据时是可以指定数据类型的。按目前的函数功能,要想实现更改列名的效果,只能依靠 rename 方法,或者用 new 方法按字段一个一个写出去,当然这两种方法的本质也不同,rename 方法能改变源序表,而 new 方法会生成一个新的序表,两种方法都不直接。

因为在输出时 xlsexport、export 函数是支持字段处理和列别名的:

  • 1、f.xlsexport(A,x:F,…;s;p)
  • 2、f.export(A,x:F,…;s)

这些想法可能是我异想天开了,恳请大佬们指点解惑。若能实现函数功能拓展,那是最好不过了。

万分感谢!Happy Holidays!