Jump to content

Module:Tabular data and Module:Tabular data/sandbox: Difference between pages

(Difference between pages)
Page 1
Page 2
Content deleted Content added
m Protected "Module:Tabular data": High-risk template or module: 385 transclusions (more info) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
 
make minimal version of function (explicit column indices, one occurrence etc)
 
Line 89: Line 89:


function p._lookup(args)
function p._lookup(args)

local data = args.data or mw.ext.data.get(args[1])
--local data = args.data or mw.ext.data.get(args[1])
local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing
local data = args.data or mw.ext.data.get(page)

local searchValue = args.search_value
local searchValue = args.search_value
local searchPattern = args.search_pattern
local searchPattern = args.search_pattern
Line 114: Line 118:
if (searchValue and record[searchColumnIdx] == searchValue) or
if (searchValue and record[searchColumnIdx] == searchValue) or
(searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then
(searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then
numMatchingRecords = numMatchingRecords + 1
if numMatchingRecords == math.abs(occurrence) then
local args = mw.clone(args)
args.data = data
args.output_row = i
return p._cell(args)
end
end
end
end
function p._lookup2(args)

--local data = args.data or mw.ext.data.get(args[1])
local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing
local data = args.data or mw.ext.data.get(page)

local searchValue = args.search_value
local searchPattern = args.search_pattern
local searchColumnName = args.search_column
local searchValue2 = args.search_value2
local searchPattern2 = args.search_pattern2
local searchColumnName2 = args.search_column2
local searchColumnIdx
for i, field in ipairs(data.schema.fields) do
if field.name == searchColumnName then
searchColumnIdx = i
end
if searchColumnIdx then
break
end
end
assert(searchColumnIdx, mw.ustring.format("Search column “%s” not found.", searchColumnName))

local searchColumnIdx2
for i, field in ipairs(data.schema.fields) do
if field.name == searchColumnName2 then
searchColumnIdx2 = i
end
if searchColumnIdx2 then
break
end
end
assert(searchColumnIdx2, mw.ustring.format("Search column “%s” not found.", searchColumnName2))
local occurrence = tonumber(args.occurrence) or 1
local numMatchingRecords = 0
for i = (occurrence < 0 and #data.data or 1),
(occurrence < 0 and 1 or #data.data),
(occurrence < 0 and -1 or 1) do
local record = data.data[i]
if (searchValue and tostring(record[searchColumnIdx]) == searchValue)
and (searchValue2 and tostring(record[searchColumnIdx2]) == searchValue2) then
-- or (searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then
if (1==1) then return data.data[i][3] end -- just return single occurence
numMatchingRecords = numMatchingRecords + 1
numMatchingRecords = numMatchingRecords + 1
if numMatchingRecords == math.abs(occurrence) then
if numMatchingRecords == math.abs(occurrence) then
Line 134: Line 198:
return p._lookup(frame.args)
return p._lookup(frame.args)
end
end

--- As p.lookup() except requiring match of values in two columns
--- Usage: {{#invoke: Tabular data | lookup2 | Table name | search_value = Value to find in column | search_pattern = Pattern to find in column | search_column = Name of column to search in | search_value2 = Value to find in second column | search_pattern2 = Pattern to find in second column | search_column2 = Name of second column to search in | occurrence = 1-based index of the matching row to output | output_column = Name of column to output | output_column2 = Name of another column to output | … | output_format = String format to output the values in }}
function p.lookup2(frame)
--return p._lookup2(frame.args)
return p.lookup2_minimal(frame.args)
end
-- version for testing resources
function p.lookup2_minimal(args)
--local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing
local data = args.data or mw.ext.data.get("UN:Total population, both sexes combined.tab" )

local searchValue = args.search_value
--local searchPattern = args.search_pattern
--local searchColumnName = args.search_column
local searchValue2 = args.search_value2
--local searchPattern2 = args.search_pattern2
--local searchColumnName2 = args.search_column2
local searchColumnIdx = 1
local searchColumnIdx2 = 2

--local occurrence = tonumber(args.occurrence) or 1
local numMatchingRecords = 0
for i = 1, #data.data, 1 do
local record = data.data[i]
if (searchValue and tostring(record[searchColumnIdx]) == searchValue)
and (searchValue2 and tostring(record[searchColumnIdx2]) == searchValue2) then
-- or (searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then
return data.data[i][3] -- just return single occurence

end
end
end




function p._wikitable(args)
function p._wikitable(args)