职贝云数AI新零售门户

标题: 11、一个简单功能阐明deepseek处理成绩的运用 [打印本页]

作者: GBh28zHK    时间: 3 天前
标题: 11、一个简单功能阐明deepseek处理成绩的运用

(, 下载次数: 0)
分析完成后deepseek给出了python完成方式,如下图:这种方式不是我们想要的,接着诘问:excel能否有函数可以完成该功能?
(, 下载次数: 0)
深度思索后deepseek给出了三种方法,如下截图:
(, 下载次数: 0)

(, 下载次数: 0)

(, 下载次数: 0)
接下就是将各方法复制,到excel表格中停止测试,方法一测试后前往错误值#CALC!,继续诘问,提示词:方法一前往错误值“#CALC!”。deepseek给出修正后的公式:
=IF(A2="", "",

    TEXTJOIN(",", TRUE,

        LET(

            nums, FILTERXML("<a><b>"&SUBSTITUTE(A2,",","</b><b>")&"</b></a>","//b"),

            count, ROWS(nums),

            seq, SEQUENCE(count),

            vals, --nums,

            diffs, IF(seq=1,1, vals-INDEX(vals,seq-1)),

            starts, FILTER(seq, (seq=1) + (diffs>1)),

            ends, IF(ROWS(starts)=1, count,

                VSTACK(DROP(starts,1)-1, count)),

            MAP(starts, ends, LAMBDA(s,e,

                IF(s=e, INDEX(vals,s),

                    INDEX(vals,s)&"-"&INDEX(vals,e)))

        )

    )

)

(, 下载次数: 0)
将公式复制到excel 单元格C2中,向下拖拽复制,得到了想要的结果,如下图:
(, 下载次数: 0)
同时deepseek也给出了兼容的VBA自定义函数,如下图
(, 下载次数: 0)
残缺代码为:
Function CompressNumbers(inputStr As String) As String

    Dim nums() As String

    Dim numList() As Long

    Dim i As Long, startVal As Long, endVal As Long

    Dim result As String, count As Long

    ' 分割输入字符串

    nums = Split(inputStr, ",")

    count = UBound(nums)

    If count < 0 Then Exit Function

    ' 转换为数字数组

    ReDim numList(count)

    For i = 0 To count

        numList(i) = Val(Trim(nums(i)))

    Next i

    ' 紧缩序列

    i = 0

    Do While i <= count

        startVal = numList(i)

        endVal = startVal

        ' 查找延续序列

        Do While i < count

            If numList(i + 1) = numList(i) + 1 Then

                endVal = numList(i + 1)

                i = i + 1

            Else

                Exit Do

            End If

        Loop

        ' 添加到结果

        If result <> "" Then result = result & ","

        If startVal = endVal Then

            result = result & startVal

        Else

            result = result & startVal & "-" & endVal

        End If

        i = i + 1

    Loop

    CompressNumbers = result

End Function

按alt+F11键,打开VBA编辑器,点击菜单栏“插入”-“模块”,这时会自动创建一个模块,将deepseek生成的VBA自定义函数代码复制粘贴到模块,如下图:

(, 下载次数: 0)

关闭VBA编辑器,回到excel界面,在D2单元格输入自定义的函数CompressSequence(输入前三个字母就可以出来,只需选择即可),选择数据系列所在单元格,公式随即前往结果,如下图:超级表中运用公式时参数用的是[@列名]也就是指向列名列,普通表中的参数为详细的单元格,公式需向下复制。超级表中公式会自动填充,无需拖动复制,同时添加新数据时公式也会自动填充。

(, 下载次数: 0)

接上去验证powerquery中的方式,按下图步骤将表格导入powerquery。

(, 下载次数: 0)

进入后将数据系列的类型改为文本

(, 下载次数: 0)

点击高级编辑器,进入M代码编辑界面,将deepseek生成的代码复制粘贴覆盖原有代码,如下图

(, 下载次数: 0)

此时,M函数报错“Expression.SyntaxError: 应为令牌”,将此错误作为提示词,继续诘问,如下图

(, 下载次数: 0)

思索后deepseek给出新的语句;

let

    // 步骤1:获取数据

    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],  // 确保这里的表名与实践表名分歧

    // 步骤2:添加自定义列处理紧缩逻辑

    添加自定义列 = Table.AddColumn(源, "紧缩结果", each

        let

            // 分割字符串并转换为数字列表

            数字列表 = List.Transform(

                List.RemoveItems(Text.Split([数字序列], ","), {""}),

                each Number.From(Text.Trim(_))

            ),

            // 确保列表有序(虽然输入应该是递增的)

            有序列表 = List.Sort(数字列表),

            // 运用List.Accumulate停止分组处理

            分组结果 = List.Accumulate(

                // 从第二个元素末尾处理

                List.RemoveFirstN(有序列表, 1),

                // 初始形态:{当前起始值, 当前结束值, 结果列表}

                {有序列表{0}, 有序列表{0}, {}},

                (state, current) =>

                    let

                        上一个结束值 = state{1},

                        当前起始值 = state{0},

                        结果列表 = state{2},

                        // 检查能否延续

                        能否延续 = current = 上一个结束值 + 1

                    in

                        if 能否延续 then

                            // 延续:更新结束值

                            {当前起始值, current, 结果列表}

                        else

                            // 不延续:添加当前组,末尾新组

                            let

                                新组 = if 当前起始值 = 上一个结束值 then

                                    Text.From(当前起始值)

                                else

                                    Text.From(当前起始值) & "-" & Text.From(上一个结束值),

                                更新后的结果列表 = 结果列表 & {新组}

                            in

                                {current, current, 更新后的结果列表}

            ),

            // 添加最后一组

            最后一组 = if 分组结果{0} = 分组结果{1} then

                Text.From(分组结果{0})

            else

                Text.From(分组结果{0}) & "-" & Text.From(分组结果{1}),

            一切组 = 分组结果{2} & {最后一组},

            // 组合最终结果

            最终结果 = Text.Combine(一切组, ",")

        in

            最终结果

    ),

    // 步骤3:删除原始列(可选)

    删除原始列 = Table.RemoveColumns(添加自定义列, {"数字序列"})

in

    删除原始列

将新的语句复制粘贴覆盖原来的M语句,此时语句未报错,如下图

(, 下载次数: 0)

点击完成,此时powerquery中前往函数执行的结果,如下图:结果也是我们想要的,

(, 下载次数: 0)

点击关闭并上载,导入数据对话框中选择表-现有工作表,点击确定,如下图:

(, 下载次数: 0)

生成的结果便前往到了我们指定的地位,如下图:

(, 下载次数: 0)


C13单元格中的公式:

=CompressNumbers(TEXTJOIN(",",,SORT(A13:A22,,1))),将数据用sort函数停止升序排序,然后再停止衔接,最后运用自定义函数停止紧缩,结果显然是我们想要的。





欢迎光临 职贝云数AI新零售门户 (https://www.taojin168.com/cloud/) Powered by Discuz! X3.5