在 Lua 中处理 TSV 文件
Processing TSV Files in Lua
我有一个非常非常大的 TSV 文件。第一行是headers。如果字段为空,则以下行包含数据,后跟制表符或 double-tabs,否则字段可以包含字母数字或字母数字加标点符号。
例如:
Field1<tab>Field2<tab>FieldN<newline>
这些字段可能包含空格、标点符号或字母数字。唯一不变的是:
- 每个字段后跟一个制表符,最后一个除外
- 最后一个字段后跟一个换行符
- 空白字段用制表符填充。与所有其他字段一样,它们后跟一个选项卡。这使得他们 double-tab.
我在 lua 中尝试了多种模式匹配组合,但从未完全正确。通常,带有标点符号的字段(时间和日期字段)是吸引我的。
我需要保留空白字段(带有 double-tab 的字段),以便其余字段始终具有相同的索引值。
提前致谢!
试试下面的代码:
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
我有一个非常非常大的 TSV 文件。第一行是headers。如果字段为空,则以下行包含数据,后跟制表符或 double-tabs,否则字段可以包含字母数字或字母数字加标点符号。
例如:
Field1<tab>Field2<tab>FieldN<newline>
这些字段可能包含空格、标点符号或字母数字。唯一不变的是:
- 每个字段后跟一个制表符,最后一个除外
- 最后一个字段后跟一个换行符
- 空白字段用制表符填充。与所有其他字段一样,它们后跟一个选项卡。这使得他们 double-tab.
我在 lua 中尝试了多种模式匹配组合,但从未完全正确。通常,带有标点符号的字段(时间和日期字段)是吸引我的。
我需要保留空白字段(带有 double-tab 的字段),以便其余字段始终具有相同的索引值。
提前致谢!
试试下面的代码:
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