Lua.js脚本为什么覆盖我的CSV文件?

我正在记录能源系统中的某些对象。 为此,我本地创建CSV文件。 问题是,每当脚本运行15分钟时,它就会覆盖前15分钟的数据。 我希望它每天创建一个CSV文件(可行) 将当天所有数据写入其中(仅最后15分钟)

--require('socket.ftp')

-- ftp文件
--ftpfile = string.format('ftp://ftplogin:ftppassword@192.168.1.11/%s.csv', os.date('%Y-%m-%d_%H-%M'))
--使用本地ftp
ftpfile = string.format('/home/ftp/%s.csv', os.date('%Y-%m-%d'))
--获取过去15分钟的数据(3600秒)
logtime = os.time() - 15 * 60

--按ID列出对象
objects = {}

--启用日志记录的对象
query = 'SELECT address, datatype, name FROM objects WHERE disablelog=0'
for _, object in ipairs(db:getall(query)) do
  objects[ tonumber(object.address) ] = {
    datatype = tonumber(object.datatype),
    name = tostring(object.name or ''),
  }
end

-- csv缓冲区
buffer = { '"日期","地址","名称","值"' }

--获取对象日志
query = 'SELECT src, address, datahex, logtime, eventtype FROM objectlog WHERE logtime >= ? ORDER BY id DESC'
for _, row in ipairs(db:getall(query, logtime)) do
  object = objects[ tonumber(row.address) ]

  --找到匹配的对象并且事件类型是组写
  if object and row.eventtype == 'write' then
    datatype = object.datatype

    --检查对象数据类型是否设置
    if datatype then
      --解码数据
      data = knxdatatype.decode(row.datahex, datatype)

      --从char / string数据类型中删除空字符
      if datatype == dt.char or datatype == dt.string then
        data = data:gsub('%z+', '')
      --将日期转换为DD.MM.YYYY
      elseif datatype == dt.date then
        data = string.format('%.2d.%.2d.%.2d', data.day, data.month, data.year)
      --将时间转换为HH:MM:SS
      elseif datatype == dt.time then
        data = string.format('%.2d:%.2d:%.2d', data.hour, data.minute, data.second)
      end
    else
      data = ''
    end

    --格式化csv行
    logdate = os.date('%Y.%m.%d %H:%M:%S', row.logtime)
    csv = string.format('%q,%q,%q,%q', logdate, knxlib.decodega(row.address), object.name, tostring(data))

    --添加到缓冲区
    table.insert(buffer, csv)
  end
end

--只有缓冲区中有数据才上传到ftp
--if #buffer > 1 then
--  result, err = socket.ftp.put(ftpfile, table.concat(buffer, '\r\n'))
--end

--上传时出错
--if err then
--  alert('FTP上传错误:%s', tostring(err))
if #buffer > 1 then
  data = table.concat(buffer, '\r\n')
  io.writefile(ftpfile, data)
end
点赞
用户5373986
用户5373986

如果 buffer 的长度大于 1,则将数组 buffer 中的内容用 \r\n 连接成一个字符串,并打开一个文件句柄 file。然后将该字符串写入文件中,并关闭文件句柄。因为 writefile 没有追加选项,所以需要采用上述方式进行操作。

2020-03-05 11:27:44
用户13010802
用户13010802

我找到了问题: 现在它能工作了 感谢大家的帮助!! :D

if #buffer > 1 then
  --We maken de data compatibel om als string te writen in ons doc.
    data = table.concat(buffer, '\r\n')
  --Connectie leggen met het document , de "ab" wil zeggen dat er append zal worden gebruikt en geen overschrijving
    local file = io.open(ftpfile, "ab")
  --Schrijf de data naar het opgegeven pad
    io.writefile(ftpfile, data)
  --connectie stilleggen.
    io.close(file)
    file = nil
end
2020-03-05 15:40:06