
我有許多製表符分隔的 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
意識到
\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」。