如何用Lua提取文件中的Average Dload(平均下载速度)值
问题描述
我有一个如下格式的文件内容:
** Resuming transfer from byte position 13247324 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 9539k 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 9539k 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 9539k 0 8192 0 0 598 0 4:32:14 0:00:13 4:32:01 1882 0 9539k 0 13238 0 0 865 0 3:08:12 0:00:15 3:07:57 2459 39k 11 1109k 0 0 12684 0 0:12:50 0:01:29 0:11:21 22753 11 9539k 11 1117k 0 0 12570 0 0:12:57 0:01:31 0:11:26 15004 11 9539k 11 1117k 0 0 12433 0 0:13:05 0:01:32 0:11:33 11847 11 9539k 11 1117k 0 0 12299 0 0:13:14 0:01:33 0:11:41 9191 11 9539k 11 1117k 0 0 12168 0 0:13:22 0:01:34 0:11:48 6011 11 9539k 11 1124k 0 0 12122 0 0:13:25 0:01:35 0:11:50 2844 12 9539k 12 1173k 0 0 12566 0 0:12:57 0:01:35 0:11:22 12479 12 9539k 12 1173k 0 0 12384 0 0:13:08 0:01:37 0:11:31 11475 12 9539k 12 1173k 0 0 12257 0 0:13:16 0:01:38 0:11:38 11473 12 9539k 12 1197k 0 0 12371 0 0:13:09 0:01:39 0:11:30 16129
我需要提取其中的**Average Dload(平均下载速度)**值。当前我的Lua代码如下:
local file = io.open(path, "rb") if not file then return nil end local lines = {} local words = {} for line in io.lines(path) do for word in line:gmatch("%w+") do table.insert(words, word) end table.insert(lines, words) end file:close() return words;
但这段代码返回所有单词及索引,无法定位到特定的Average Dload值,我是Lua新手,希望得到帮助。
解决方案
要提取Average Dload值,首先明确它的位置:观察文件内容,表头里Average Speed下方对应的Dload列,就是目标数据列,在数据行中是第7个非空字段(按空格分隔)。
修改后的代码如下:
local path = "你的文件路径" -- 替换为实际文件路径 local file = io.open(path, "r") if not file then return nil end local avg_dload_values = {} -- 存储所有平均下载速度值 -- 跳过前4行(恢复传输提示、表头、空行) for i = 1, 4 do file:read("*l") end -- 读取后续数据行 for line in file:lines() do -- 按非空字符分割行,过滤空格 local fields = {} for field in line:gmatch("%S+") do table.insert(fields, field) end -- 第7个字段即为Average Dload值 if #fields >= 7 then table.insert(avg_dload_values, fields[7]) end end file:close() -- 打印所有提取到的平均下载速度值 for _, val in ipairs(avg_dload_values) do print("Average Dload:", val) end return avg_dload_values
代码说明
- 跳过无关行:前4行是提示信息、表头和空行,无有效数据,直接跳过。
- 分割字段:用
%S+匹配非空字符序列,将每行数据分割为字段数组,避免空格干扰。 - 定位目标字段:数据行中第7个字段就是Average Dload值,提取后存入数组。
- 结果返回:返回存储所有平均下载速度的数组,若只需最终的平均速度,可直接取
avg_dload_values[#avg_dload_values]。
内容的提问来源于stack exchange,提问作者user190549
相关产品推荐
相关产品推荐

