Expansão Macro em Ambiente Tabular

Expansão Macro em Ambiente Tabular

Eu tenho muitos arquivos CSV separados por tabulações que gostaria de converter em tabelas automaticamente no ambiente tabular do látex. As tabelas são nomeadas:registro_%onde % pode ser um dos símbolos \in {at,be,fr,....}. Por exemplo, cada arquivo se parece com abaixo:

 
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

Tentei o código abaixo que infelizmente não 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}

Ao executar o código acima, recebo um erro:


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

O mesmo exemplo funciona codificando o símbolo da seguinte forma:


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

no lugar de


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

Carreguei a solução funcional codificando no seguinte link: goo.gl/nbI5TQ
Acredito que o problema é que a macro \i é expandida e o ambiente tabular não consegue expandir \names. Mas eu não tenho certeza. É possível expandir a macro \names[\i] como um grupo e não apenas \i?
Eu apreciaria qualquer tipo de ajuda mínima para resolver meu problema.

Obrigado :)

Responder1

O código parece excessivamente complexo. Se você deseja apenas percorrer a lista de arquivos, acho que você só precisa de um loop from etoolbox, digamos, e do comando relevante from csvsimple.

Por exemplo com 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                                                                          

e 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

O .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}

produz a seguinte saída

resultado de trabalho

Observe que este código assume que os arquivos são chamados logs/log_<xx>.texou que os arquivos são logs/log_<xx>. Se eles tiverem uma extensão diferente, você precisará especificá-la.

Responder2

Esteja ciente que

  1. \csvautotabular[separator=tab]significa que você precisa usar tabulações em vez de espaços para separar itens dentro de uma linha do arquivo csv.

  2. a maneira como o TeX processa nomes de arquivos não é a mesma em todas as plataformas.
    Por exemplo, ao usar o MiKTeX 2.9 no Windows 7, o TeX sempre assume a extensão de nome de arquivo ".tex" se nenhuma extensão de nome de arquivo for fornecida. Se o nome do arquivo em questão não tiver nenhuma extensão, você precisará fornecer o ponto (sem extensão) de qualquer maneira.
    Por exemplo, se você deseja especificar o arquivo "log_at" no subdiretório "logs" do diretório atual, você precisa escrever ./logs/log_at.. (Se você especificar ./logs/log_at(sem ponto final), o (MiK)TeX procurará o arquivo "log_at.tex" no subdiretório "logs" do diretório atual.

informação relacionada