Lua - 从不一致的 CSV 文件中检索所有倒数第二个值
Lua - Retrieve all second from last values from an inconsistent CSV file
我有一个 csv 文件 (DailyEnergyCost.txt),其中包含许多不同的行条目变体,但它只是我要检索的最后一个值的第一个和第二个。所以我可以将它们绘制在图表上
2022-03-14 23:59:00, 23.51, 6.21, 0.264,
2022-03-15 23:59:00, 21.74, 5.74, 0.264,
2022-03-16 23:59:00, 18.87, 4.98, 0.264,
2022-03-23 09:00:37, 145.79, 38.49, 0.264,
2022-03-23 09:06:44, 3210.2370, 3210.5250, 0.29, 0.08, 0.264,
2022-03-23 23:59:00, 3210.5250, 3224.2470, 13.72, 3.62, 0.264,
2022-03-29 23:59:00, 1648508340, 1648594740, 3322.4630, 3343.3360, 20.87, 5.51, 0.264,
2022-03-30 23:59:00, 1648594740, 1648681140, 3343.3360, 3365.2770, 21.94, 5.79, 0.264,
2022-03-31 23:59:00, 1648681140, 1648767540, 3365.2770, 3395.7930, 30.52, 8.06, 0.264,
现在我已经尝试弄清楚获取最后一个条目的逻辑,在数组中使用上面 csv 中的一行..见下文..但这只适用于一点。
local arr = {3210.5250, 3224.2470, 13.72, 3.62, 0.264}
for i,v in pairs(arr) do
last = #arr - 1
end
print(last)
我也知道还有 lines
选项,允许我逐行浏览文件..
local file = io.open("www/DailyEnergyCost.txt")
local lines = file:lines()
for line in lines do
print("\t" .. line)
end
但是,有人可以分享您如何通过 csv 文件逐行工作,该文件没有一致的条目以提取最后一个条目吗?
使用上面的数据源示例作为指导,生成的 Lua 脚本应该 return 以下内容。 (第一项,倒数第二项)。
2022-03-14 23:59:00, 6.21
2022-03-15 23:59:00, 5.74
2022-03-16 23:59:00, 4.98
2022-03-23 09:00:37, 38.49
2022-03-23 09:06:44, 0.08
2022-03-23 23:59:00, 3.62
2022-03-29 23:59:00, 5.51
2022-03-30 23:59:00, 5.79
2022-03-31 23:59:00, 8.06
读取整个文件并使用模式取值:
local fp = io.open("www/DailyEnergyCost.txt","rb")
local text = fp:read('*a')
print(text)
local time, value
for line in text:gmatch("[^%c]+") do
time = line:match("^(.-),")
value = line:match(".+,%s+(.-),.-,") or ""
print(time .. ", " .. value)
end
解释:
"^(.-),"
:
^
- 从开始
(.-),
- 匹配第一个符号 ,
之前的所有字符(惰性量词)
".+,%s+(.-),.-,"
:
.+,
- 从结尾开始第 3 个符号 ,
之前的所有字符,(贪婪量词)
%s+
- 最大空间
(.-),
- 匹配我们的字符(在,
之前最少)
.-,
- 这不是我们的角色 - 这里不见了。
这是我最后使用的代码,非常感谢@Mike V 在这方面的帮助..
local fh,err = io.open("www/DailyEnergyCost.txt")
if err then print("file not found"); return; end
-- Open a file for write
local fho,err = io.open("/mnt/nas/DailyEnergyCostExtract.txt","wb")
local time, value
while true do
line = fh:read()
if line == nil then break end
if line:gmatch("[^%c]+") then
time = line:match("^(.-),")
value = line:match(".+,%s+(.-),.-,") or ""
-- print(time .. ", " .. value)
fho:write(time .. ", " .. value)
fho:write("\n")
end
end
fh:close()
fho:close()
-- Let’s just check the file.
local file = io.open("/mnt/nas/DailyEnergyCostExtract.txt")
local lines = file:lines()
for line in lines do
print("\t" .. line)
end
我有一个 csv 文件 (DailyEnergyCost.txt),其中包含许多不同的行条目变体,但它只是我要检索的最后一个值的第一个和第二个。所以我可以将它们绘制在图表上
2022-03-14 23:59:00, 23.51, 6.21, 0.264,
2022-03-15 23:59:00, 21.74, 5.74, 0.264,
2022-03-16 23:59:00, 18.87, 4.98, 0.264,
2022-03-23 09:00:37, 145.79, 38.49, 0.264,
2022-03-23 09:06:44, 3210.2370, 3210.5250, 0.29, 0.08, 0.264,
2022-03-23 23:59:00, 3210.5250, 3224.2470, 13.72, 3.62, 0.264,
2022-03-29 23:59:00, 1648508340, 1648594740, 3322.4630, 3343.3360, 20.87, 5.51, 0.264,
2022-03-30 23:59:00, 1648594740, 1648681140, 3343.3360, 3365.2770, 21.94, 5.79, 0.264,
2022-03-31 23:59:00, 1648681140, 1648767540, 3365.2770, 3395.7930, 30.52, 8.06, 0.264,
现在我已经尝试弄清楚获取最后一个条目的逻辑,在数组中使用上面 csv 中的一行..见下文..但这只适用于一点。
local arr = {3210.5250, 3224.2470, 13.72, 3.62, 0.264}
for i,v in pairs(arr) do
last = #arr - 1
end
print(last)
我也知道还有 lines
选项,允许我逐行浏览文件..
local file = io.open("www/DailyEnergyCost.txt")
local lines = file:lines()
for line in lines do
print("\t" .. line)
end
但是,有人可以分享您如何通过 csv 文件逐行工作,该文件没有一致的条目以提取最后一个条目吗?
使用上面的数据源示例作为指导,生成的 Lua 脚本应该 return 以下内容。 (第一项,倒数第二项)。
2022-03-14 23:59:00, 6.21
2022-03-15 23:59:00, 5.74
2022-03-16 23:59:00, 4.98
2022-03-23 09:00:37, 38.49
2022-03-23 09:06:44, 0.08
2022-03-23 23:59:00, 3.62
2022-03-29 23:59:00, 5.51
2022-03-30 23:59:00, 5.79
2022-03-31 23:59:00, 8.06
读取整个文件并使用模式取值:
local fp = io.open("www/DailyEnergyCost.txt","rb")
local text = fp:read('*a')
print(text)
local time, value
for line in text:gmatch("[^%c]+") do
time = line:match("^(.-),")
value = line:match(".+,%s+(.-),.-,") or ""
print(time .. ", " .. value)
end
解释:
"^(.-),"
:
^
- 从开始
(.-),
- 匹配第一个符号 ,
之前的所有字符(惰性量词)
".+,%s+(.-),.-,"
:
.+,
- 从结尾开始第 3 个符号 ,
之前的所有字符,(贪婪量词)
%s+
- 最大空间
(.-),
- 匹配我们的字符(在,
之前最少)
.-,
- 这不是我们的角色 - 这里不见了。
这是我最后使用的代码,非常感谢@Mike V 在这方面的帮助..
local fh,err = io.open("www/DailyEnergyCost.txt")
if err then print("file not found"); return; end
-- Open a file for write
local fho,err = io.open("/mnt/nas/DailyEnergyCostExtract.txt","wb")
local time, value
while true do
line = fh:read()
if line == nil then break end
if line:gmatch("[^%c]+") then
time = line:match("^(.-),")
value = line:match(".+,%s+(.-),.-,") or ""
-- print(time .. ", " .. value)
fho:write(time .. ", " .. value)
fho:write("\n")
end
end
fh:close()
fho:close()
-- Let’s just check the file.
local file = io.open("/mnt/nas/DailyEnergyCostExtract.txt")
local lines = file:lines()
for line in lines do
print("\t" .. line)
end