Hello all,
to solve my problem I need to find why my function ParseCSVdata
incorrectly parses strings stored in a macro.
It's including possibly the reason why do not work properly Mojca
database module as I wrote in a recent mail.
It seems to enter a string function, which is not my function to find a
separator.
Thanx Jaroslav
Here is my minimal example:
\startluacode
function ParseCSVdata(string2parse, separator, leftdelimiter,
rightdelimiter)
-- Funkce pro "rozparsování" jednotlivých záznamů (řádků) CSV tabulky
-- Vstupní textový řetězec (načtený řádek) je v místech výskytu
separátoru "rozsekán" na jednotlivá pole
-- Jediný povinný vstupní parametr je 'string2parse'. Při
nenastavení zbývajících tří parametrů se jako separátor a oddělovače
použijí buď globální proměnné Sep, Ld a Rd nebo se použijí defaultní hodnoty
-- Výstupem je pole oddělených řetězců
-- Když nejsou globální proměnné Sep, Ld a Rd nastaveny uživatelem,
nastaví se na defaultní hodnoty. Uživatel si může defaultní hodnoty
libovolně změnit podle toho, jaké hodnoty používá ve svých aplikacích
nejčastěji
Sep = (Sep == nil) and UserCSVSeparator or Sep -- Pokud není
glob. neznámá Sep nastavena, použije se defaultní hodnota ';' (středník).
Ld = (Ld == nil) and UserCSVLeftDelimiter or Ld -- Pokud není glob.
neznámá Ld (left delimiter) nastavena, použije se defaultní hodnota ''
(prázdný řetězec)
Rd = (Rd == nil) and UserCSVRightDelimiter or Rd -- Pokud není
glob. neznámá Rd (right delimiter) nastavena, použije se defaultní
hodnota '' (prázdný řetězec)
-- Nastavení hodnot parametrů, které nejsou při volání funkce
nastaveny tj. při volání funkce ParseCSVdata(string2parse) s pouze
jedním parametrem
local separator = (separator == nil) and Sep or separator -- při
nenastavení separátoru se použije
local leftdelimiter = (leftdelimiter == nil) and Ld or leftdelimiter
local rightdelimiter = (rightdelimiter == nil) and Rd or rightdelimiter
-- A jdeme na vlastní zpracování řetězce ...
local result={}
if leftdelimiter ~= '' and rightdelimiter ~= '' then -- Když
jsou položky v řádku vymezeny levým i pravým delimiterem (tj. jakousi
závorkou) např. "pole1";"pole2" nebo {pole1};{pole2} .. atd.
string.gsub(string2parse,
leftdelimiter.."(.-)"..rightdelimiter, function(a)
table.insert(result,a) end ) -- Je vidět, že v tomto případě ani
nezáleží na separátoru, jednotlivé uzávorkované řetězce se od sebe oddělí
else -- Když je pouze separátor polí bez vymezujících znaků -
delimiterů (tento případ bohužel neumožňuje použití separátoru jako
samostatného znaku v nějakém poli )
result=string.split(string2parse,separator) -- pak stačí
vstupní řetezec jen "vysplitovat" tj. rozsekat na samostatné části
end
return result -- Funkce vrátí pole result obsahující oddělená
jednotlivá pole řádkového CSV záznamu
end
function pars(inppar)
tex.sprint("input parametr (string): "..inppar.."\\par")
CSVLine=ParseCSVdata(inppar,',','','')
tex.print(table.maxn(CSVLine).." item(s) \\par")
for i = 1, table.maxn(CSVLine) do
tex.sprint(i..". "..CSVLine[i].."\\par")
end
tex.sprint("\\blank[big]")
end
\stopluacode
\def\printaction{x,y,z,u,v}
\starttext
\startluacode
pars("a,b,c,d")
pars("\\printaction")
\stopluacode
\stoptext