
タブで区切られた 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" を検索します。)