![如何从 datatool DB 中挑选数据并计算总数](https://linux22.com/image/272562/%E5%A6%82%E4%BD%95%E4%BB%8E%20datatool%20DB%20%E4%B8%AD%E6%8C%91%E9%80%89%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%AE%A1%E7%AE%97%E6%80%BB%E6%95%B0.png)
我有一个包含当前价格/商品的 CSV 文件。这些价格会定期更新。
我已经加载了一个数据库datatool
。我想使用这些价格根据我的 LaTeX 文件中的数量来计算总数。
我price.csv
的如下:
item, price
A, 0.1
B, 0.03
C, 1.2
现在我想要一个表格,其中包含我的数量和总数,如下所示:
Item Quantity Total
A 100 10
B 5 0.15
C 1 1.2
Total 106 11.53
所有总数都经过计算,因为值往往price.csv
会发生变化。
答案1
datatool
提供了许多函数来访问和处理数据库内容。使用以下函数可以轻松执行计算:fp
-符号:
\documentclass{article}
\usepackage{datatool,filecontents}% http://ctan.org/pkg/{datatool,filecontents}
\newcommand{\resetgrandtotals}{\gdef\grandtotal{0}\gdef\totalcount{0}}
\newcommand{\itemtotal}[2]{% \itemtotal{<item>}{<quantity>}
\DTLgetvalueforkey{\result}{price}{price}{item}{#1}% Extract data from database
\FPeval\result{trunc(\result*#2:2)}\result% Calculate total & display
\FPeval\totalcount{trunc(\totalcount+#2:0)}% Add to total count
\FPeval\grandtotal{trunc(\grandtotal+\result:2)}% Add to grand total
\xdef\grandtotal{\grandtotal}% Make definition global
\xdef\totalcount{\totalcount}% Make definition global
}
\newcommand{\itemprice}[1]{% \itemprice{<item>}
\DTLgetvalueforkey{\result}{price}{price}{item}{#1}\result% Extract data from database
}
\begin{filecontents*}{price.csv}
item, price
A, 0.1
B, 0.03
C, 1.2
\end{filecontents*}
\begin{document}
\DTLloaddb{price}{price.csv}% Load database
\DTLdisplaydb{price}% Display database
\resetgrandtotals
\begin{tabular}{lrr}
Item & Quantity & Total \\
\hline
A & 100 & \itemtotal{A}{100} \\ % 10.00
B & 5 & \itemtotal{B}{5} \\ % 0.15
C & 1 & \itemtotal{C}{1} \\ % 1.20
Total & \totalcount & \grandtotal % 11.53
\end{tabular}
The price associated with~B is \itemprice{B}.
\end{document}
上述 MWE 提供了\itemtotal{<item>}{<quantity>}
根据数量和价格(后者使用 从数据库中提取\DTLgetvalueforkey
)打印商品总数的功能。此外,它还会计算\totalcount
和\grandtotal
以供稍后在表格中使用。\itemprice{<item>}
用作的包装器以\DTLgetvalueforkey
返回与商品相关的价格<item>
。
需要重置总数,并使用 实现\resetgrandtotals
。