Lua中处理TSV文件

我有一个非常非常大的TSV文件。第一行是标题。下面的行包含数据,后面跟着制表符或双制表符,如果字段为空,则字段可以包含字母数字或字母数字加标点符号。例如:

Field1    Field2    FieldN

字段可能包含空格、标点符号或字母数字。唯一不变的事情是:

  1. 每个字段后面都跟着一个制表符,除了最后一个
  2. 最后一个字段后面跟着一个换行符
  3. 空白字段用制表符填充。像所有其他字段一样,它们后面跟着一个制表符。这使它们成为双制表符。

我在lua中尝试了许多组合的模式匹配,但从未完全正确。通常是那些带有标点符号(时间和日期字段)的字段让我无法匹配。

我需要保留空白字段(双制表符字段),以使其余字段始终具有相同的索引值。

提前致谢!

点赞
用户107090
用户107090

尝试以下代码:

function test(s)
    local n=0
    s=s..'\t'
    for w in s:gmatch("(.-)\t") do
        n=n+1
        print(n,"["..w.."]")
    end
end

test("10\t20\t30\t\t50")
test("100\t200\t300\t\t500\t")

它在字符串末尾添加一个制表符,以便所有字段都跟随一个制表符,甚至是最后一个字段。

2019-12-07 14:59:11
用户12968803
用户12968803

行和列被分开:

local filename = "big_tables.tsv"  -- 用制表符分隔的值
-- local filename = "big_tables.csv" -- 用逗号分隔的值

local lines = io.lines(filename) -- 将文件作为行打开
local tables = {} -- 新表,行和列作为tables[n_column][n_row]=value
for line in lines do -- 行迭代器
    local i = 1 -- 第一列
    for value in (string.gmatch(line, "[^%s]+")) do  -- 用制表符分隔的值
--  for value in (string.gmatch(line, '%d[%d.]*')) do -- 用逗号分隔的值
        tables[i]=tables[i]or{} -- 如果没有该列则创建新的
        tables[i][#tables[i]+1]=tonumber(value) -- 添加行数值
        i=i+1 -- 列迭代器
    end
end
2021-01-08 11:13:07