xtable headers and handlecsv loop
Hello, The sample below has 2 problems I cannot find the solution for: I am reading a table from a CSV file and want to typeset it via \xtable. The xtable as defined below works, it splits over several pages, but the header does not repeat. I have seen examples in the mailing list where people put the "\startxtable.....\stopxtable" within a \placefigure, but as soon as I try this, I get an error message: "missing } or endgroup", although I doublechecked the "}" and I see no error. The other issue I have: Since xtable requires me to read the header line separately in order to put it between \startxtablehead and \stopxtablehead, I access the csv buffer twice: the first time, I only read the first line, and the second time, I read starting from the second line. My problem here is that I do not know beforehand the number of lines in the csv file. So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing. \usemodule[handlecsv] \opencsvfile{systaprov2.csv} \starttext \startbuffer[loop] \startxrow \startxcell[left] \cA \stopxcell \startxcell[left] \cB \stopxcell \startxcell[left] \cC \stopxcell \startxcell[left] \cD \stopxcell \startxcell \cE \stopxcell \startxcell[left] \cF \stopxcell \startxcell \cG \stopxcell \startxcell \cH \stopxcell \doifdefined{cI}{\startxcell \cI \stopxcell} \doifdefined{cJ}{\startxcell \cJ \stopxcell} \doifdefined{cK}{\startxcell [left] \cK \stopxcell} \stopxrow \stopbuffer \setupxtable[offset=0cm, frame=off, bottomframe=on, framecolor=gray, option=stretch, align=middle] \setupxtable[head][background=color, backgroundcolor=gray, topframe=on, bottomframe=on, framecolor=black, foregroundcolor=blue] \setupxtable[left][align=right] \startxtable[header=repeat] \startxtablehead[head] \doloopfromto{1}{1}{\getbuffer[loop]} \stopxtablehead \startxtablebody \doloopfromto{2}{500}{\getbuffer[loop]} \stopxtablebody \stopxtable \stoptext
Geert Dobbels schrieb am 03.04.2020 um 11:57:
Hello,
The sample below has 2 problems I cannot find the solution for:
I am reading a table from a CSV file and want to typeset it via \xtable.
The xtable as defined below works, it splits over several pages, but the header does not repeat. I have seen examples in the mailing list where people put the "\startxtable.....\stopxtable" within a \placefigure, but as soon as I try this, I get an error message: "missing } or endgroup", although I doublechecked the "}" and I see no error.
The other issue I have: Since xtable requires me to read the header line separately in order to put it between \startxtablehead and \stopxtablehead, I access the csv buffer twice: the first time, I only read the first line, and the second time, I read starting from the second line. My problem here is that I do not know beforehand the number of lines in the csv file. So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing.
\usemodule[handlecsv]
\opencsvfile{systaprov2.csv}
\starttext
\startbuffer[loop] \startxrow \startxcell[left] \cA \stopxcell \startxcell[left] \cB \stopxcell \startxcell[left] \cC \stopxcell \startxcell[left] \cD \stopxcell \startxcell \cE \stopxcell \startxcell[left] \cF \stopxcell \startxcell \cG \stopxcell \startxcell \cH \stopxcell \doifdefined{cI}{\startxcell \cI \stopxcell} \doifdefined{cJ}{\startxcell \cJ \stopxcell} \doifdefined{cK}{\startxcell [left] \cK \stopxcell} \stopxrow \stopbuffer
\setupxtable[offset=0cm, frame=off, bottomframe=on, framecolor=gray, option=stretch, align=middle]
\setupxtable[head][background=color, backgroundcolor=gray, topframe=on, bottomframe=on, framecolor=black, foregroundcolor=blue]
\setupxtable[left][align=right]
\startxtable[header=repeat]
Add "split=repeat" to \startxtable.
\startxtablehead[head] \doloopfromto{1}{1}{\getbuffer[loop]} \stopxtablehead \startxtablebody \doloopfromto{2}{500}{\getbuffer[loop]} \stopxtablebody
\stopxtable
\stoptext
Wolfgang
Wolfgang, Thanks for this. It works, however, the page where the table starts has three lines of text before the table starts. After inserting "split=repeat", the table jumps to the next page, leaving the rest of the page with the three lines of text completely blank. This did not happen without the "split=repeat". Geert On 03/04/2020 12:18, Wolfgang Schuster wrote:
Geert Dobbels schrieb am 03.04.2020 um 11:57:
Hello,
The sample below has 2 problems I cannot find the solution for:
I am reading a table from a CSV file and want to typeset it via \xtable.
The xtable as defined below works, it splits over several pages, but the header does not repeat. I have seen examples in the mailing list where people put the "\startxtable.....\stopxtable" within a \placefigure, but as soon as I try this, I get an error message: "missing } or endgroup", although I doublechecked the "}" and I see no error.
The other issue I have: Since xtable requires me to read the header line separately in order to put it between \startxtablehead and \stopxtablehead, I access the csv buffer twice: the first time, I only read the first line, and the second time, I read starting from the second line. My problem here is that I do not know beforehand the number of lines in the csv file. So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing.
\usemodule[handlecsv]
\opencsvfile{systaprov2.csv}
\starttext
\startbuffer[loop] \startxrow \startxcell[left] \cA \stopxcell \startxcell[left] \cB \stopxcell \startxcell[left] \cC \stopxcell \startxcell[left] \cD \stopxcell \startxcell \cE \stopxcell \startxcell[left] \cF \stopxcell \startxcell \cG \stopxcell \startxcell \cH \stopxcell \doifdefined{cI}{\startxcell \cI \stopxcell} \doifdefined{cJ}{\startxcell \cJ \stopxcell} \doifdefined{cK}{\startxcell [left] \cK \stopxcell} \stopxrow \stopbuffer
\setupxtable[offset=0cm, frame=off, bottomframe=on, framecolor=gray, option=stretch, align=middle]
\setupxtable[head][background=color, backgroundcolor=gray, topframe=on, bottomframe=on, framecolor=black, foregroundcolor=blue]
\setupxtable[left][align=right]
\startxtable[header=repeat]
Add "split=repeat" to \startxtable.
\startxtablehead[head] \doloopfromto{1}{1}{\getbuffer[loop]} \stopxtablehead \startxtablebody \doloopfromto{2}{500}{\getbuffer[loop]} \stopxtablebody
\stopxtable
\stoptext
Wolfgang
-- -- *_IHTS Approvals S.L._* Geert Dobbels geert@ihts.eu mailto:geert@ihts.eu Zubiegi 11, E-01139 Bitoriano (Spain) 0034 945 462633 ihts.eu
On 4/3/20 11:57 AM, Geert Dobbels wrote:
Hello,
The sample below has 2 problems I cannot find the solution for:
I am reading a table from a CSV file and want to typeset it via \xtable.
The xtable as defined below works, it splits over several pages, but the header does not repeat. I have seen examples in the mailing list where people put the "\startxtable.....\stopxtable" within a \placefigure, but as soon as I try this, I get an error message: "missing } or endgroup", although I doublechecked the "}" and I see no error.
Hi Geert, your sample lacks the CSV file. Of course, we don’t need your actual data, but something to test your sample is required. BTW, how about using \startembeddedxtable...\stopembeddedxtable instead of \startxtable...\stopxtable? This has worked for me in some documents.
The other issue I have: Since xtable requires me to read the header line separately in order to put it between \startxtablehead and \stopxtablehead, I access the csv buffer twice: the first time, I only read the first line, and the second time, I read starting from the second line. My problem here is that I do not know beforehand the number of lines in the csv file.
I don’t understand what you aiming at, but \numrows gives exactly that information.
So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing.
If \numrows doesn’t fit your needs, please provide a CSV file with fake data. I cannot guess why a second loop might be required. I hope it helps, Pablo -- http://www.ousia.tk
On 4/3/20 12:31 PM, Pablo Rodriguez wrote:
On 4/3/20 11:57 AM, Geert Dobbels wrote:
[...] So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing.
If \numrows doesn’t fit your needs, please provide a CSV file with fake data. I cannot guess why a second loop might be required.
Hi Geert, this approach is simpler: \starttext \startxtable \startxtablehead[head] \doloopif{\lineno}{<}{2}{\getbuffer[loop]} \stopxtablehead \startxtablebody \doloopif{\lineno}{>}{1}{\getbuffer[loop]} \stopxtablebody \stopxtable \stoptext Only loop header with CSV lines numbered below 2, and loop boody with CSV lines numbered above 1. Pablo -- http://www.ousia.tk
Pablo, Gracias, your suggestion with \rownums works. I will try this one too, since it is a simpler solution. By the way, All information I have about handlecsv comes from the PDF file you wrote. \rownums and \lineno are not explained in this document. Do you know of documentation that describes those aspects ? Geert On 03/04/2020 13:34, Pablo Rodriguez wrote:
On 4/3/20 12:31 PM, Pablo Rodriguez wrote:
On 4/3/20 11:57 AM, Geert Dobbels wrote:
[...] So in my second \doloopfromto I give the second argument a number high enough to be sure it reads all the lines. It works fine, but I would like to know if there is a way to read the number of lines in the csv file to use the exact number of lines, instead of guessing. If \numrows doesn’t fit your needs, please provide a CSV file with fake data. I cannot guess why a second loop might be required. Hi Geert,
this approach is simpler:
\starttext \startxtable \startxtablehead[head] \doloopif{\lineno}{<}{2}{\getbuffer[loop]} \stopxtablehead \startxtablebody \doloopif{\lineno}{>}{1}{\getbuffer[loop]} \stopxtablebody \stopxtable \stoptext
Only loop header with CSV lines numbered below 2, and loop boody with CSV lines numbered above 1.
Pablo -- http://www.ousia.tk ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
On 4/3/20 3:16 PM, Geert Dobbels wrote:
Pablo,
Gracias, your suggestion with \rownums works. I will try this one too, since it is a simpler solution. By the way, All information I have about handlecsv comes from the PDF file you wrote. \rownums and \lineno are not explained in this document. Do you know of documentation that describes those aspects ?
Geert, de nada 😉. I know that handlecsv has many other features that aren’t documented. I don’t have much time now, but as I wrote the user manual, I didn’t have many cases that didn’t look extremely complex. And this would be the best way to scare newcomers. If you aren’t scared, t-handlecsv.lua contains a complete list of defined commands (as a huge comment near the end of the file). You might be interested in reading them. Or feel free to ask here for help, if you don’t find the command, its explanation, or the right approach to solve an issue dealing with data from CSV files. (But please, individual issues, not the explatiation for the whole command list 😅.) Pablo -- http://www.ousia.tk
participants (3)
-
Geert Dobbels
-
Pablo Rodriguez
-
Wolfgang Schuster