如何使用 datatool 将多个数据库的内容放在一个表中?

如何使用 datatool 将多个数据库的内容放在一个表中?

几乎太简单了:

我有两个数据库“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包将数据文件输入到“数组”数据结构(此处名为firstsecond)。然后这些数组元素可以在表中重新出现。唯一的怪癖,我使用了基于 Herbert 在 中提供的解决方案如何使用 `\whiledo` 以编程方式制作表格行?,用于构造表格每一行的 必须在表格环境之外执行。具体来说,内部的\whiledo制表符的存在在某种程度上是一个问题(Herbert 已解决)。&\whiledotabular

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

在此处输入图片描述

相关内容