在Lua中处理TSV文件

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

例如:

Field1<tab>Field2<tab>FieldN<newline>

字段可以包含空格,标点符号或字母数字。唯一保持正确的是:

  1. 每个字段后都有一个标签,最后一个标签除外
  2. 最后一个字段后跟换行符
  3. 空白字段中有一个标签。像所有其他字段一样,它们后面都有一个选项卡。这使它们成为了双重标签。

我已经尝试过在lua中进行模式匹配的许多组合,但从未完全正确。通常带有标点符号的字段(时间和日期字段)才是让我受益的字段。

我需要保留空白字段(带有双标签的字段),以便其余字段始终处于相同的索引值。

预先感谢!

kakyomuyu 回答:在Lua中处理TSV文件

尝试以下代码:

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")

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

,

行和列分开:

local filename = "big_tables.tsv"  -- tab separated values
-- local filename = "big_tables.csv" -- comma separated values

local lines = io.lines(filename) -- open file as lines
local tables = {} -- new table with columns and rows as tables[n_column][n_row]=value
for line in lines do -- row iterator
    local i = 1 -- first column
    for value in (string.gmatch(line,"[^%s]+")) do  -- tab separated values
--  for value in (string.gmatch(line,'%d[%d.]*')) do -- comma separated values
        tables[i]=tables[i]or{} -- if not column then create new one
        tables[i][#tables[i]+1]=tonumber(value) -- adding row value
        i=i+1 -- column iterator
    end
end
本文链接:https://www.f2er.com/2958739.html

大家都在问