在日常数据处理中,我们常遇到这样的场景:
-
• 客户地址字段混杂省市区,如 北京市海淀区中关村南大街5号 -
• 业务系统导出数据需按省、市、区、详细地址分类统计 -
• 遇到直辖市、自治区、特别行政区时,常规拆分规则瞬间失效
传统方案(如简单按字符截取)不仅代码复杂,还需人工维护大量规则。而今天,我们将借助 DeepSeek + Power BI(Power Query 部分),实现中国地址智能解析,覆盖所有行政规划特殊性!
Power Query 功能强大,但上手却并不简单,尤其是对于零基础的小白用户,很多时候:
-
• 不知道如何正确输入代码 -
• 不知道哪个按钮实现想要的功能 -
• 经常在 PQ 中乱点一通,却得不到想要的结果
DeepSeek 的出现解决了这些痛点:
-
• 只需要告诉 DeepSeek 你想做什么,它立刻告诉你如何操作 -
• 完全不用懂复杂的 M 代码
如果让你在 PQ 中将以下地址拆分为省、市、区/县和详细地址四列,你会怎么做?

我们看看 DeepSeek 能不能帮我们来解决这个问题。

DeepSeek 给出了完整的代码和操作步骤,按照指示在 Power Query 中运行这些代码。新建一个查询,在高级编辑器中粘贴 DeepSeek 给出的代码。

运行之后发现直辖市和特别行政区部分出现了报错。

直辖市区字段为空白,详细地址错误,特别行政区区和详细地址都发生报错。
让 DeepSeek 修改一下,先修改直辖市部分,直接告诉 DeepSeek 直辖市部分报错即可。

修改之后直辖市部分正确。

最后再来让 DeepSeek 修改一下特别行政区部分的错误。

将 Power Query 中的代码修改一下,所有地址都可以正确显示了。

整个过程不需要我们去写 M 语言代码,Power Query 小白也搞定!完整代码如下,修改对应的地址源数据即可。
let
Source = 地址,
// 提取省
AddProvince = Table.AddColumn(
Source,
"省",
each (
let
addr = [地址],
sortedProvinces = List.Sort(
{
"内蒙古自治区",
"广西壮族自治区",
"西藏自治区",
"宁夏回族自治区",
"新疆维吾尔自治区",
"北京市",
"天津市",
"上海市",
"重庆市",
"河北省",
"山西省",
"辽宁省",
"吉林省",
"黑龙江省",
"江苏省",
"浙江省",
"安徽省",
"福建省",
"江西省",
"山东省",
"河南省",
"湖北省",
"湖南省",
"广东省",
"海南省",
"四川省",
"贵州省",
"云南省",
"陕西省",
"甘肃省",
"青海省",
"台湾省",
"香港特别行政区",
"澳门特别行政区"
},
(x, y) => Value.Compare(Text.Length(y), Text.Length(x))
),
matchedProvince = List.First(List.Select(sortedProvinces, each Text.StartsWith(addr, _)))
in
matchedProvince
)
),
// 判断是否直辖市
AddIsMunicipality = Table.AddColumn(
AddProvince,
"是否直辖市",
each List.Contains({"北京市", "天津市", "上海市", "重庆市"}, [省])
),
// 判断是否特别行政区
AddIsSAR = Table.AddColumn(
AddIsMunicipality,
"是否特别行政区",
each List.Contains({"香港特别行政区", "澳门特别行政区"}, [省])
),
// (兼容特别行政区)
AddCity = Table.AddColumn(
AddIsSAR,
"市",
each
if [是否直辖市] then
[省]
elseif [是否特别行政区] then
null // 特别行政区无市级单位
else
(
let
remaining1 = Text.ReplaceRange([地址], 0, Text.Length([省]), ""),
suffixes = {"自治州", "地区", "盟", "市"},
positions = List.Transform(
suffixes,
each Text.PositionOf(remaining1, _, Occurrence.First)
),
adjusted = List.Transform(
{0 .. 3},
each if positions{_} >=0then positions{_} + Text.Length(suffixes{_}) else null
),
validPositions = List.RemoveNulls(adjusted),
firstPos =if List.IsEmpty(validPositions) then null else List.Min(validPositions),
city =if firstPos = null then null else Text.Start(remaining1, firstPos)
in
city
)
),
// 提取区(关键修正点)
AddDistrict = Table.AddColumn(
AddCity,
"区",
each
let
// 根据行政类型计算剩余地址
remainingAfterProvince = Text.ReplaceRange([地址], 0, Text.Length([省]), ""),
remaining2 =if [是否直辖市] or [是否特别行政区] then remainingAfterProvince // 特别行政区/直辖市无需替换市级部分
else Text.ReplaceRange(remainingAfterProvince, 0, Text.Length([市]), ""),
// 区级提取逻辑(需扩展特别行政区区级后缀)
suffixes = {"自治县", "自治旗", "县", "区", "市", "旗", "半岛", "离岛"}, // 新增港澳常见后缀
positions = List.Transform(suffixes, each Text.PositionOf(remaining2, _, Occurrence.First)),
adjusted = List.Transform(
{0 .. 5},
each if positions{_} >=0then positions{_} + Text.Length(suffixes{_}) else null
),
validPositions = List.RemoveNulls(adjusted),
firstPos =if List.IsEmpty(validPositions) then null else List.Min(validPositions),
district =if firstPos = null then null else Text.Start(remaining2, firstPos)
in
district
),
// 提取详细地址
AddDetail = Table.AddColumn(
AddDistrict,
"详细地址",
each
let
base = Text.ReplaceRange([地址], 0, Text.Length([省]), ""),
remaining =
if [是否特别行政区] then
Text.ReplaceRange(base, 0, Text.Length([区]), "") // 特别行政区直接跳过市级
elseif [是否直辖市] then
Text.ReplaceRange(base, 0, Text.Length([区]), "")
else
Text.ReplaceRange(
Text.ReplaceRange(base, 0, Text.Length([市]), ""),
0,
Text.Length([区]),
""
)
in
remaining
)
in
AddDetail
过去,我们做数据分析的时候,总感觉数据处理任务复杂难懂,尤其是像客户地址这种包含特殊情况的字段拆分,经常会耗费大量精力,最终效果还可能差强人意:
-
• 每次面对稍微复杂一点的数据,都需要花费大量时间学习 PQ 代码; -
• 各种特殊情况层出不穷,往往需要反复调整,效率低下; -
• 想要自动化处理,但又缺乏相关技能,总是无奈手动“返工”。
借助 DeepSeek,原本复杂繁琐的数据拆分工作变得前所未有的简单:
-
• 不需要深入理解复杂的代码; -
• 不需要逐一处理特殊地址格式; -
• 只需要明确告诉 DeepSeek 你的需求,它就能智能识别并自动生成可用的解决方案。
赶快开启你的智能数据分析之旅吧,让 AI 帮你释放创造力,助你迅速实现从“小白”到数据高手的跃迁,轻松在数据时代占据优势!从此数据处理不再是数据专家的专利,每个人都能轻松完成数据分析,解放你的双手,把时间精力投入到更重要的业务决策之中。
2025,ABI革命,人人可用。

