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
to solve my problem I need to find why my function ParseCSVdata incorrectly parses strings stored in a macro.
You can work around the problem by defining a Lua function that calls the macro: \def\parse#1{\directlua{pars("#1")}} You can then either call it directly: \parse{\printaction} or from Lua with tex.print: \startluacode tex.print("\\parse{\\printaction}") \stopluacode and the macros are expanded in the order you want. It's admittedly a bit silly, but it works. As a side note, the infinitive of the verb related to “parser” is “to parse” in English, with an ‘e’ at the end. Arthur
participants (2)
-
Arthur Reutenauer
-
Jaroslav Hajtmar