表格环境中的宏扩展

表格环境中的宏扩展

我有许多制表符分隔的 csv 文件,我想在 latex 的表格环境中将它们自动转换为表格。表格名称如下:日志_%其中 % 可以是符号 \in {at,be,fr,....} 之一。例如,每个文件如下所示:

 
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

我尝试了下面的代码,但不幸的是它不起作用!

\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}

通过执行上述代码我得到一个错误:


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

相同示例可以通过对符号进行硬编码来实现,如下所示:


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

代替


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

我通过以下链接上的硬编码上传了可行的解决方案:goo.gl/nbI5TQ
我认为问题在于宏 \i 得到扩展,而表格环境无法扩展 \names。但我不确定。是否可以将宏 \names[\i] 作为一个组进行扩展,而不仅仅是 \i?如果能提供
任何帮助来解决我的问题,我将不胜感激。

谢谢 :)

答案1

代码似乎过于复杂。如果您只想循环遍历文件列表,我认为您只需要从 循环etoolbox,然后从 执行相关命令csvsimple

例如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                                                                          

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

代码.tex

\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}

产生以下输出

工作输出

请注意,此代码假定文件名为logs/log_<xx>.tex或文件为logs/log_<xx>。如果它们具有不同的扩展名,则需要指定它。

答案2

意识到

  1. \csvautotabular[separator=tab]意味着您需要使用制表符而不是空格来分隔 csv 文件中一行内的项目。

  2. TeX 处理文件名的方式在所有平台上并不相同。
    例如,在 Windows 7 下使用 MiKTeX 2.9 时,如果未提供文件扩展名,TeX 始终假定文件扩展名为“.tex”。如果所讨论的文件名根本没有扩展名,则无论如何都需要提供点(不带扩展名)。例如,
    如果您希望在当前目录的子目录“logs”中指定文件“log_at”,则需要写入./logs/log_at.。(如果您指定 ./logs/log_at(不带尾随点),(MiK)TeX 将在当前目录的子目录“logs”中寻找文件“log_at.tex”。

相关内容