Power Query中解析PHP序列化数组并拼接为逗号分隔字符串
解决方案
你不需要写显式循环,用Power Query内置的列表处理函数就能实现需求,且容错率远高于转JSON的方案,完整转换代码如下:
Table.TransformColumns(#"替换为你上一步的步骤名称", {{"替换为你要处理的列名", each let // 1. 按双引号拆分整个字符串 SplitByQuote = Text.Split(_, """"), // 2. 去掉第一个无意义的拆分结果,然后交替取1个跳过1个,刚好拿到所有引号内的内容 ExtractValues = List.Alternate(List.RemoveFirstN(SplitByQuote, 1), 1, 1), // 3. 用逗号加空格拼接所有提取到的元素 JoinResult = Text.Combine(ExtractValues, ", ") in JoinResult, type text}})
逻辑说明
以你给出的示例序列化字符串a:3:{i:0;s:4:"Text";i:1;s:2:"in";i:2;s:5:"array";}为例:
- 按双引号拆分后得到列表:
{"a:3:{i:0;s:4:", "Text", ";i:1;s:2:", "in", ";i:2;s:5:", "array", ";}"} - 去掉第一个元素后,所有目标内容都在列表的奇数索引位置,用
List.Alternate直接提取即可得到纯内容列表{"Text", "in", "array"} - 拼接后就是你需要的
Text, in, array格式
适配内容含转义双引号的场景
如果你的PHP数组元素内容本身包含双引号(PHP序列化时会自动转义为\"),可以加一步转义还原处理,代码如下:
Table.TransformColumns(#"替换为你上一步的步骤名称", {{"替换为你要处理的列名", each let // 先把转义的双引号替换为临时占位符 ReplaceEscapedQuote = Text.Replace(_, "\""", "||TEMP_DQ||"), SplitByQuote = Text.Split(ReplaceEscapedQuote, """"), ExtractValues = List.Alternate(List.RemoveFirstN(SplitByQuote, 1), 1, 1), // 把临时占位符还原为双引号 RestoreQuote = List.Transform(ExtractValues, each Text.Replace(_, "||TEMP_DQ||", """")), JoinResult = Text.Combine(RestoreQuote, ", ") in JoinResult, type text}})
关于你提到的循环语法说明
Power Query 支持用List.Generate实现显式循环,但这个场景下完全不需要使用,内置的列表处理函数效率更高、代码更简洁。
内容的提问来源于stack exchange,提问作者roland
相关产品推荐
相关产品推荐

