Makroerweiterung in tabellarischer Umgebung

Makroerweiterung in tabellarischer Umgebung

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!

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

Beim Ausführen des obigen Codes erhalte ich eine Fehlermeldung:


! 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 etoolboxbeispielsweise 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 .texCode

\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

Arbeitsleistung

Beachten Sie, dass dieser Code davon ausgeht, dass Dateien aufgerufen werden logs/log_<xx>.texoder dass die Dateien logs/log_<xx>. Wenn sie eine andere Erweiterung haben, müssen Sie diese angeben.

Antwort2

Beachten Sie, dass

  1. \csvautotabular[separator=tab]bedeutet, dass Sie Tabulatoren statt Leerzeichen verwenden müssen, um Elemente innerhalb einer Zeile der CSV-Datei zu trennen.

  2. 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.)

verwandte Informationen