如何编写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
相关产品推荐
相关产品推荐

