Expansión macro en entorno tabular

Expansión macro en entorno tabular

Tengo muchos archivos csv separados por tabulaciones que me gustaría convertir en tablas automáticamente en un entorno tabular de látex. Las tablas se nombran:registro_%donde % puede ser uno de los símbolos \in {at,be,fr,....}. Por ejemplo, cada archivo se ve así:

 
accuracy    timepred    timelearn   timelearn2  timelearn4  rmsetrain
0.987747    0.532   2.44    nan nan 0.987676
0.987747    0.528   2.396   nan nan 0.987676
0.987747    0.544   2.408   nan nan 0.987676
0.987747    0.496   2.388   nan nan 0.987676
0.987747    0.436   2.432   nan nan 0.987676
0.987747    0.428   2.444   nan nan 0.987676
0.987747    0.464   2.452   nan nan 0.987676
0.987747    0.428   2.452   nan nan 0.987676
0.987747    0.464   2.46    nan nan 0.987676
0.987747    0.484   2.448   nan nan 0.987676

¡Probé el siguiente código que desafortunadamente no funciona!

\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{csvsimple}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{array}
\usepackage{pgfplotstable}
\newcounter{listtotal}\newcounter{listcntr}%
\NewDocumentCommand{\names}{o}{%
  \setcounter{listtotal}{0}\setcounter{listcntr}{-1}%
  \renewcommand*{\do}[1]{\stepcounter{listtotal}}%
  \expandafter\docsvlist\expandafter{\namesarray}%
  \IfNoValueTF{#1}
    {\namesarray}% \names
    {% \names[]
     \renewcommand*{\do}[1]{\stepcounter{listcntr}\ifnum\value{listcntr}=#1\relax##1\fi}%
     \expandafter\docsvlist\expandafter{\namesarray}}%
}

\begin{document} \newcommand{\namesarray}{at,br,cz,dk,fi,ie,nb,no,pt,se,be,ch,de,es,fr,it,nl,pl,ru,uk}% \foreach \i in {0,...,20}{ \newcommand{\name}{\names[\i]} \name \csvautotabular[separator=tab]{logs/log_\names[\i]} \par } \end{document}

Al ejecutar el código anterior aparece un error:


! Package csvsimple Error: File 'logs/log_\names [0]' not existent, not readable, or empty!.

El mismo ejemplo funciona codificando el símbolo de la siguiente manera:


\csvautotabular[separator=tab]{logs/log_at} \par

en lugar de


\csvautotabular[separator=tab]{logs/log_\names[\i]} \par

Cargué la solución funcional codificando en el siguiente enlace: goo.gl/nbI5TQ.
Creo que el problema es que la macro \i se expande y el entorno tabular no logra expandir \names. Pero no estoy seguro. ¿Es posible expandir la macro \names[\i] como un grupo y no solo \i?
Agradecería cualquier tipo de ayuda mínima para solucionar mi problema.

Gracias :)

Respuesta1

El código parece demasiado complejo. Si solo desea recorrer la lista de archivos, creo que solo necesita un bucle desde etoolbox, por ejemplo, y el comando relevante desde csvsimple.

Por ejemplo con logs/log_at:

accuracy        timepred        timelearn       timelearn2      timelearn4      rmsetrain                                                           
0.987747        0.532   2.44    nan     nan     0.987676                                                                                            
0.987747        0.528   2.396   nan     nan     0.987676                                                                                            
0.987747        0.544   2.408   nan     nan     0.987676                                                                                            
0.987747        0.496   2.388   nan     nan     0.987676                                                                                            
0.987747        0.436   2.432   nan     nan     0.987676                                                                                            
0.987747        0.428   2.444   nan     nan     0.987676                                                                                            
0.987747        0.464   2.452   nan     nan     0.987676                                                                                            
0.987747        0.428   2.452   nan     nan     0.987676                                                                                            
0.987747        0.464   2.46    nan     nan     0.987676                                                                                            
0.987747        0.484   2.448   nan     nan     0.987676                                                                          

y logs/log_br:

accuracy        timepred        timelearn       timelearn2      timelearn4      rmsetrain                                                           
0.987747        0.532   2.44    nan     nan     0.987676                                                                                            
0.987747        0.528   2.396   nan     nan     0.987676                                                                                            
0.987747        0.544   2.408   nan     nan     0.987676                                                                                            
0.987747        0.496   2.388   nan     nan     0.987676                                                                                            
0.987747        0.436   2.432   nan     nan     0.987676                                                                                            
0.987747        0.428   2.444   nan     nan     0.987676                                                                                            
0.987747        0.464   2.452   nan     nan     0.987676                                                                                            
0.987747        0.428   2.452   nan     nan     0.987676
0.987747        0.464   2.46    nan     nan     0.987676
0.987747        0.484   2.448   nan     nan     0.987676

El .texcódigo

\documentclass{article}
\usepackage{csvsimple}
\usepackage{etoolbox}
\providecommand*\do{}
\begin{document}
\renewcommand*\do[1]{%
  #1
  \csvautotabular[separator=tab]{logs/log_#1}\par
}
\docsvlist{at,br}%,cz,dk,fi,ie,nb,no,pt,se,be,ch,de,es,fr,it,nl,pl,ru,uk}%
\end{document}

produce la siguiente salida

salida de trabajo

Tenga en cuenta que este código supone que los archivos se llaman logs/log_<xx>.texo que los archivos son logs/log_<xx>. Si tienen una extensión diferente, debes especificarla.

Respuesta2

Sé consciente de

  1. \csvautotabular[separator=tab]significa que debe usar tabulaciones en lugar de espacios para separar elementos dentro de una línea del archivo csv.

  2. La forma en que TeX procesa los nombres de archivos no es la misma en todas las plataformas.
    Por ejemplo, cuando se utiliza MiKTeX 2.9 en Windows 7, TeX siempre asume la extensión del nombre de archivo ".tex" si no se proporciona ninguna extensión de nombre de archivo. Si el nombre de archivo en cuestión no tiene ninguna extensión, deberá proporcionar el punto (sin extensión) de todos modos.
    Por ejemplo, si desea especificar el archivo "log_at" en el subdirectorio "logs" del directorio actual, debe escribir ./logs/log_at.. (Si especifica ./logs/log_at(sin punto final), (MiK)TeX buscará el archivo "log_at.tex" en el subdirectorio "logs" del directorio actual.

información relacionada