我有许多制表符分隔的 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
意识到
\csvautotabular[separator=tab]
意味着您需要使用制表符而不是空格来分隔 csv 文件中一行内的项目。TeX 处理文件名的方式在所有平台上并不相同。
例如,在 Windows 7 下使用 MiKTeX 2.9 时,如果未提供文件扩展名,TeX 始终假定文件扩展名为“.tex”。如果所讨论的文件名根本没有扩展名,则无论如何都需要提供点(不带扩展名)。例如,
如果您希望在当前目录的子目录“logs”中指定文件“log_at”,则需要写入./logs/log_at.
。(如果您指定./logs/log_at
(不带尾随点),(MiK)TeX 将在当前目录的子目录“logs”中寻找文件“log_at.tex”。