几乎太简单了:
我有两个数据库“First”和“Second”,它们都从制表符分隔的文件“First.txt”和“Second.txt”中获取数据
两者都包含两列(“年份”和“数字”)以及等量的行!
此代码:
\begin{document}
\catcode`\^^I=12 %
\DTLsetseparator{ }%
\DTLloaddb{First}{First.txt}
\DTLloaddb{Second}{Second.txt}
\begin{table}[htbp]
\caption{First}
\centering
\DTLdisplaydb{First}
\end{table}
\begin{table}[htbp]
\caption{Second}
\centering
\DTLdisplaydb{Second}
\end{table}
\end{document}
创建两个单独的表,但我试图创建一个包含三列的表:年份、数字(从第一列开始)、数字(从第二列开始)。
我知道这听起来微不足道(可能确实如此)......但我陷入困境。
有人知道吗?
答案1
这是将第二个数据库的第二列附加到第一个数据库的方法。(为了简单起见,我使用了逗号分隔值而不是制表符分隔值,但您可以根据需要进行更改。)这假设两个数据库的行都具有相同的顺序(在第一列上)。
\documentclass{article}
\usepackage{datatool}
% generate first test database
\begin{filecontents}{first.csv}
Year,Number
2001,10
2002,20
2003,30
2004,40
\end{filecontents}
% generate second test database
\begin{filecontents}{second.csv}
Year,Number
2001,101
2002,202
2003,303
2004,404
\end{filecontents}
\DTLloaddb{first}{first.csv}
\DTLloaddb{second}{second.csv}
\begin{document}
% append second column of second data base to first data base
\newcount\rowIdx
\dtlforcolumn{\secondNumber}{second}{Number}%
{%
% iterate through each entry in the `Number' column of the second database
\advance\rowIdx by 1\relax
% get corresponding row of first database
\dtlgetrow{first}{\rowIdx}%
% append to current row (this new column is assigned the key `Number2')
\dtlappendentrytocurrentrow{Number2}{\secondNumber}%
% update first database
\dtlrecombine
}
\DTLdisplaydb{first}
\end{document}
结果如下:
答案2
这使用readarray
包将数据文件输入到“数组”数据结构(此处名为first
和second
)。然后这些数组元素可以在表中重新出现。唯一的怪癖,我使用了基于 Herbert 在 中提供的解决方案如何使用 `\whiledo` 以编程方式制作表格行?,用于构造表格每一行的 必须在表格环境之外执行。具体来说,内部的\whiledo
制表符的存在在某种程度上是一个问题(Herbert 已解决)。&
\whiledo
tabular
\documentclass{article}
\usepackage{readarray}
\newcounter{index}
% Based on:
% https://tex.stackexchange.com/questions/7590/
% how-to-programmatically-make-tabular-rows-using-whiledo
\makeatletter
\newcounter{tabindex}
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{%
\@tabtoks\expandafter{\the\@tabtoks\stepcounter{tabindex}#1}}
\newcommand*\resettabtoks{\@tabtoks{}}
\newcommand*\synctabindex[1]{\setcounter{tabindex}{\value{#1}}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\begin{document}
\readdef{First.txt}{\tmpa}
\readArrayij{\tmpa}{first}{\ncols}
\readdef{Second.txt}{\tmpb}
\readArrayij{\tmpb}{second}{\ncols}
%
\resettabtoks
\setcounter{index}{0}
\synctabindex{index}
\whiledo{\value{index} < \nrows}{%
\addtocounter{index}{1}%
\addtabtoks{%
\arrayij{first}{\thetabindex}{1} &
\arrayij{first}{\thetabindex}{2} &
\arrayij{second}{\thetabindex}{2}
\ifthenelse{\equal{\thetabindex}{\nrows}}{}{\\}%
}
}
\begin{tabular}{|c|r|r|}
\hline
\printtabtoks
\\\hline
\end{tabular}
\end{document}