表格環境中的巨集展開

表格環境中的巨集展開

我有許多製表符分隔的 csv 文件,我想在乳膠的表格環境中自動將它們轉換為表格。表命名為:紀錄_%其中 % 可以是符號 \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」。

相關內容