我有一个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脚本应该返回以下内容。(第一项,倒数第二项(。
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
这是我最后使用的代码,非常感谢@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
读取整个文件并使用模式获取值:
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+
-最大空间
(.-),
-匹配我们的字符(至少在,
之前(
.-,
——这不是我们的角色——这里不见了。