You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MediaWiki Lua模块读取CSV并按用户名查询信息?

实现MediaWiki Lua模块读取CSV并按用户名查询信息

问题描述

我有如下示例CSV文件(实际数据不同,以此为例):

username,firstname,lastname,age,nationality

first_user,Mark,Smith,19,Canada
dogs_are_better_than_cats,Linda,Robertson,47,Sweden
lamborghini33,Chad,Carson,33,Finland
doctorpepper,Rachel,Hill,41,United States
shin0bi,John,Prescott,15,United States
bigshot1997,Spamton,Spamton,31,Cyber City

需要编写一个MediaWiki专用Lua模块,传入用户名作为参数,返回对应的全名、年龄等信息(用户名唯一,查询结果唯一)。

实现步骤

1. 选择数据加载方式

根据数据量大小选两种方案:

  • 小数据量:直接把CSV内容嵌入Lua模块,无需额外文件
  • 大数据量:将CSV文件上传到MediaWiki服务器指定目录(比如extensions/CustomModules/data/),确保模块能读取到文件路径

2. 编写Lua模块(Module:UserInfo)

创建名为Module:UserInfo的模块,代码如下:

local p = {}

-- 方案1:从外部CSV文件读取数据(大数据量适用)
local function loadFromCSV(filePath)
    local file = io.open(filePath, "r")
    if not file then return {} end

    local userData = {}
    local isFirstLine = true

    for line in file:lines() do
        -- 跳过空行
        if line ~= "" then
            local fields = {}
            -- 分割CSV字段(若字段含逗号/引号,需替换为更健壮的解析逻辑)
            for field in line:gmatch("[^,]+") do
                table.insert(fields, field)
            end

            if isFirstLine then
                -- 跳过表头行
                isFirstLine = false
            else
                local username = fields[1]
                userData[username] = {
                    firstname = fields[2],
                    lastname = fields[3],
                    age = fields[4],
                    nationality = fields[5],
                    fullname = fields[2] .. " " .. fields[3]
                }
            end
        end
    end

    file:close()
    return userData
end

-- 方案2:直接嵌入CSV数据(小数据量适用)
local function loadEmbeddedData()
    local userData = {}
    local csvLines = {
        "first_user,Mark,Smith,19,Canada",
        "dogs_are_better_than_cats,Linda,Robertson,47,Sweden",
        "lamborghini33,Chad,Carson,33,Finland",
        "doctorpepper,Rachel,Hill,41,United States",
        "shin0bi,John,Prescott,15,United States",
        "bigshot1997,Spamton,Spamton,31,Cyber City"
    }

    for _, line in ipairs(csvLines) do
        local fields = {}
        for field in line:gmatch("[^,]+") do
            table.insert(fields, field)
        end
        local username = fields[1]
        userData[username] = {
            firstname = fields[2],
            lastname = fields[3],
            age = fields[4],
            nationality = fields[5],
            fullname = fields[2] .. " " .. fields[3]
        }
    end
    return userData
end

-- 主查询函数
function p.getUserInfo(frame)
    -- 获取传入的用户名参数
    local username = frame.args[1] or frame.args.username
    if not username then return "请提供查询的用户名" end

    -- 二选一启用数据加载方式
    -- local userData = loadFromCSV("/path/to/your/users.csv") -- 替换为实际文件路径
    local userData = loadEmbeddedData()

    -- 查询并返回结果
    local userInfo = userData[username]
    if not userInfo then return "未找到用户:" .. username end

    -- 自定义输出格式
    return string.format(
        "**用户详情**\n- 全名:%s\n- 年龄:%s\n- 国籍:%s",
        userInfo.fullname, userInfo.age, userInfo.nationality
    )
end

return p

3. 关键细节说明

  • 查询效率:用用户名作为哈希表的键,实现O(1)快速查询,适配用户名唯一的需求
  • CSV解析:示例用简单分割逻辑,若你的CSV字段包含逗号或引号,需要替换为支持引号包裹字段的解析逻辑
  • 输出自定义:可以修改getUserInfo函数的返回格式,比如生成表格、纯文本等

4. 在Wiki页面调用模块

在MediaWiki页面中,通过以下方式调用:

-- 直接传参
{{#invoke:UserInfo|getUserInfo|first_user}}

-- 指定参数名
{{#invoke:UserInfo|getUserInfo|username=doctorpepper}}

调用后会输出格式化结果:

用户详情

  • 全名:Rachel Hill
  • 年龄:41
  • 国籍:United States

内容的提问来源于stack exchange,提问作者Private Eye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:45:33