自动输入数据

自动输入数据

我有一个 tex 主体,看起来像

本周我们库存增加了5600支疫苗,比上周增加了8.5%。

现在,这些数字5600和8.5%基于每周自动更新的表格每周更新。

该表是在 tableau 中生成的,并连接到 SQL server ,因此同一张表每周都会自动更新。我想自动反映行中的变化。我可以将表格作为参考或其他东西,但希望测试提取数据并自行更新。目前,我回到表格并根据文本中的表格手动更新每个数据。

有没有办法在 latex 中做到这一点?表格可以是 csv。表格会自行更新,但文本不会。

请帮忙

答案1

这利用了 TeX 长度以机器单位的整数形式存储的事实,并且我可以将这些长度分配到计数寄存器中,反之亦然。

MWE 中的乘数 1000 使我从整数除法中得到 3 个有效数字。这三位数字以百分比形式表示为xx.x%

我用来readarray从文件中获取数据,并将listofitems其解析为数组。

\documentclass{article}
\usepackage{readarray}
\begin{filecontents*}[overwrite]{mydata.txt}
458
589
743
799
853
942
925
1000
2345
\end{filecontents*}
\newcount\currcount
\newcount\lastcount
\newlength\currlen
\def\fmtvalue#1#2\relax{\ifx\relax#2\relax.#1\%\else#1\fmtvalue#2\relax\fi}
\def\weeklyincrease[#1]{\csname weeklyincrease[#1]\endcsname}
\begin{document}
\readarraysepchar{,}
\readdef{mydata.txt}\datadef
\ignoreemptyitems
\readlist\datarray{\datadef}
\noindent\makebox[1in][r]{Vaxx inventory}\makebox[1in][r]{Increase}\par\noindent
\foreachitem\z\in\datarray[]{%
  \noindent\makebox[1in][r]{\z}%
  \ifnum\zcnt=1\makebox[1in][r]{---~~~}\relax\else
    \lastcount=0\datarray[\zcnt-1]\relax
    \currcount=0\z\relax
    \currlen=1000\currcount\relax
    \divide\currlen by \lastcount\relax
    \currcount=\currlen\relax
    \advance\currcount by -1000\relax
    \expandafter\edef\csname weeklyincrease[\zcnt]\endcsname{%
      \expandafter\fmtvalue\the\currcount\relax}%
    \makebox[1in][r]{\weeklyincrease[\zcnt]}%
  \fi
  \par\noindent
}

In week 5, the vax inventory was \datarray[5], with a weekly
  increase of \weeklyincrease[5].
  
For week 7, the comparable numbers were \datarray[7] and
  \weeklyincrease[7]
\end{document}

在此处输入图片描述

如果您不想要表格输出,只需注释掉\makebox宏。


对于那些坚持正确舍入而不是截断的人来说,必须获得一个额外的有效数字(因此是 10000 乘数),然后评估它以确定是否要增加先验:

\documentclass{article}
\usepackage{readarray}
\begin{filecontents*}[overwrite]{mydata.txt}
458
589
743
799
853
942
925
1000
2345
\end{filecontents*}
\newcount\currcount
\newcount\lastcount
\newlength\currlen
\def\fmtvalue#1#2#3\relax{\ifx\relax#3\relax.%
  \ifnum#2>4\relax\the\numexpr#1+1\relax\else#1\fi\%\else
  #1\fmtvalue#2#3\relax\fi}
\def\weeklyincrease[#1]{\csname weeklyincrease[#1]\endcsname}
\begin{document}
\readarraysepchar{,}
\readdef{mydata.txt}\datadef
\ignoreemptyitems
\readlist\datarray{\datadef}
\noindent\makebox[1in][r]{Vaxx inventory}\makebox[1in][r]{Increase}\par\noindent
\foreachitem\z\in\datarray[]{%
  \noindent\makebox[1in][r]{\z}%
  \ifnum\zcnt=1\makebox[1in][r]{---~~~}\relax\else
    \lastcount=0\datarray[\zcnt-1]\relax
    \currcount=0\z\relax
    \currlen=10000\currcount\relax
    \divide\currlen by \lastcount\relax
    \currcount=\currlen\relax
    \advance\currcount by -10000\relax
    \expandafter\edef\csname weeklyincrease[\zcnt]\endcsname{%
      \expandafter\fmtvalue\the\currcount\relax}%
    \makebox[1in][r]{\weeklyincrease[\zcnt]}%
  \fi
  \par\noindent
}

In week 5, the vax inventory was \datarray[5], with a weekly
  increase of \weeklyincrease[5].
  
For week 7, the comparable numbers were \datarray[7] and
  \weeklyincrease[7]
\end{document}

在此处输入图片描述

相关内容