Power Query自定义函数报错:Token ')' expected问题求助
问题解决:Power Query函数报错“Token ')' expected”
错误原因分析
你的代码里最直接的语法错误是let块中的步骤分隔符缺失:在TransformColumn函数定义的结尾(in #"Added Date")之后,没有添加逗号,导致Power Query无法识别后续的TransformedColumns步骤,从而抛出“预期Token ')'”的语法错误。
除此之外,代码还存在两个逻辑问题:
TransformColumn函数每次都基于原始Source表处理,会导致每转换一列就生成一个包含所有列的新表,最后用Table.FromColumns合并时会丢失非日期列,且逻辑混乱;- 儒略日期转换逻辑有误:
Date.From(Text.From(FullYear))无法直接生成有效日期,且计算日历时应该用DayOfYear - 1作为Date.AddDays的参数(因为1月1日是当年第1天,无需额外加天数)。
修正后的代码
TransformDates = (TableName as text, DateColumns as list) => let // 连接SQL数据库并加载数据 Source = Sql.Database("Server Hidden", "RepJDE", [Query="SELECT * FROM " & TableName]), // 定义单列转换逻辑(基于传入的表而非全局Source) TransformColumn = (inputTable as table, columnName as text) => let // 拆分儒略日期:格式为CYYDDD(C=世纪码,YY=世纪内年份,DDD=年内天数) #"Split Column by Position" = Table.SplitColumn(inputTable, columnName, Splitter.SplitTextByPositions({0,1,3,6}), {"CenturyCode", "YearInCentury", "DayOfYear"}), #"Changed To Integer" = Table.TransformColumnTypes(#"Split Column by Position",{{"CenturyCode", Int64.Type}, {"YearInCentury", Int64.Type}, {"DayOfYear", Int64.Type}}), // 计算完整年份并生成当年1月1日基准日期 #"Added Base Date" = Table.AddColumn(#"Changed To Integer", "BaseDate", each let fullYear = 1900 + [CenturyCode] * 100 + [YearInCentury], baseDate = Date.From(DateTime.FromText(Text.From(fullYear) & "-01-01")) in baseDate), // 加上偏移天数得到公历日期(减1是因为1月1日是当年第1天) #"Calculated Gregorian Date" = Table.AddColumn(#"Added Base Date", columnName & "_Gregorian", each Date.AddDays([BaseDate], [DayOfYear] - 1)), // 清理临时列 #"Removed Temp Columns" = Table.RemoveColumns(#"Calculated Gregorian Date", {"CenturyCode", "YearInCentury", "DayOfYear", "BaseDate"}) in #"Removed Temp Columns", // 遍历日期列,在同一个表上逐步应用转换 TransformedTable = List.Accumulate(DateColumns, Source, (currentTable, colName) => TransformColumn(currentTable, colName)) in TransformedTable
关键修正点说明
- 修复语法错误:在
TransformColumn步骤结尾添加逗号,确保let块步骤分隔符合语法要求; - 调整列转换逻辑:将
TransformColumn改为接收当前表作为参数,用List.Accumulate遍历日期列,在同一个表上逐步转换,保留所有非日期列; - 修正日期转换逻辑:
- 正确拆分儒略日期(适配CYYDDD格式);
- 通过
DateTime.FromText生成合法的当年1月1日基准日期; - 使用
DayOfYear - 1计算偏移天数,保证日期转换准确; - 添加临时列清理步骤,避免生成冗余数据。
内容的提问来源于stack exchange,提问作者BCMan
相关产品推荐
相关产品推荐

