
Ich habe viele durch Tabulatoren getrennte CSV-Dateien, die ich in der tabellarischen Umgebung von Latex automatisch in Tabellen umwandeln möchte. Die Tabellen heißen:Protokoll_%wobei % eines der Symbole \in {at,be,fr,....} sein kann. Beispielsweise sieht jede Datei wie folgt aus:
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
Ich habe den folgenden Code ausprobiert, der leider nicht funktioniert!
Beim Ausführen des obigen Codes erhalte ich eine Fehlermeldung:\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!.
Das gleiche Beispiel funktioniert, indem das Symbol wie folgt fest codiert wird:
\csvautotabular[separator=tab]{logs/log_at} \par
anstelle von
\csvautotabular[separator=tab]{logs/log_\names[\i]} \par
Ich habe die funktionierende Lösung hochgeladen, indem ich sie unter folgendem Link fest codiert habe: goo.gl/nbI5TQ
Ich glaube, das Problem besteht darin, dass das Makro \i erweitert wird und die tabellarische Umgebung \names nicht erweitert. Aber ich bin mir nicht sicher. Ist es möglich, das Makro \names[\i] als Gruppe und nicht nur \i zu erweitern?
Ich wäre für jede noch so kleine Hilfe zur Lösung meines Problems dankbar.
Danke :)
Antwort1
Der Code scheint zu komplex. Wenn Sie nur eine Schleife über die Liste der Dateien ausführen möchten, benötigen Sie meiner Ansicht nach nur eine Schleife von etoolbox
beispielsweise und den entsprechenden Befehl von csvsimple
.
Zum Beispiel mit 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
Und 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
Der .tex
Code
\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}
erzeugt die folgende Ausgabe
Beachten Sie, dass dieser Code davon ausgeht, dass Dateien aufgerufen werden logs/log_<xx>.tex
oder dass die Dateien logs/log_<xx>
. Wenn sie eine andere Erweiterung haben, müssen Sie diese angeben.
Antwort2
Beachten Sie, dass
\csvautotabular[separator=tab]
bedeutet, dass Sie Tabulatoren statt Leerzeichen verwenden müssen, um Elemente innerhalb einer Zeile der CSV-Datei zu trennen.Die Art und Weise, wie TeX Dateinamen verarbeitet, ist nicht auf allen Plattformen gleich.
Wenn Sie beispielsweise MiKTeX 2.9 unter Windows 7 verwenden, nimmt TeX immer die Dateinamenerweiterung „.tex“ an, wenn keine Dateinamenerweiterung angegeben ist. Wenn der betreffende Dateiname überhaupt keine Erweiterung hat, müssen Sie trotzdem den Punkt (ohne Erweiterung) angeben.
Wenn Sie beispielsweise die Datei „log_at“ im Unterverzeichnis „logs“ des aktuellen Verzeichnisses angeben möchten, müssen Sie schreiben./logs/log_at.
. (Wenn Sie (ohne abschließenden Punkt) angeben./logs/log_at
, sucht (MiK)TeX nach der Datei „log_at.tex“ im Unterverzeichnis „logs“ des aktuellen Verzeichnisses.)