我尝试仅显示 csv 文件中日期位于未来的项目
\begin{tabular}{rlll} % Date&&&\\\
\csvreader[
filter test=\ifnumgreater{\datum}{\today},]%
{test.csv}{date=\datum,time=\time,titel=\titel, price=\price}%
{ \datum &\time &\checksum\,€ &\titel \\}%
\end{tabular}
日期格式为 01.01.2019。我尝试了很多方法来解析日期,但在过滤器测试中不起作用。
答案1
这个答案是基于你可以修改输入文件的假设。DD.MM.YYYY
我不会使用格式,而是假设你可以管理DD,MM,YYYY
格式(即使用逗号而不是句点)。正如我在评论中提到的,如果你必须保持格式为DD.MM.YYYY
,则需要解析字符串和许多额外的步骤。
提供的代码示例对我来说似乎有点奇怪,因为\checksum
。您没有通过从文件中获取它\csvreader
,所以我在这里忽略了它。csvsimple
文档还提供了一种制作表格的不同方法,所以我在这里使用了它。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
01,01,2019,00:00:00,t1,2
05,02,2019,00:00:01,t2,4
06,03,2020,00:00:02,t3,6
07,08,2018,00:00:03,t4,7
31,12,2018,00:00:04,t5,8
\end{filecontents*}
\usepackage[official]{eurosym}
\usepackage{etoolbox}
\usepackage{csvsimple}
\begin{document}
\makeatletter
\csvreader[no head,
tabular=rlll,
filter test=
\ifboolexpr{%
test {\ifnumgreater{\entryyear}{\number\year}}%Year is greater
or
(test{\ifnumequal{\entryyear}{\number\year}}%
and test{\ifnumgreater{\entrymonth}{\two@digits{\the\month}}})%Year is equal, but month is greater
or
(test{\ifnumequal{\entryyear}{\number\year}}%
and test{\ifnumequal{\entrymonth}{\two@digits{\the\month}}}%
and test{\ifnumgreater{\entryday}{\two@digits{\the\day}}})%Year is equal, month is equal, but day is greater
}%
]%
{test.csv}%
{1=\entryday, 2=\entrymonth, 3=\entryyear, 4=\entrytime, 5=\entrytitle, 6=\entryprice}%
{ \entryday.\entrymonth.\entryyear & \entrytime & \entryprice\,\euro{} & \entrytitle }%
\makeatother
\end{document}
我包含了我使用的文件内容。由于您没有提供文件示例.csv
,因此您可能需要相应地修改此示例。
您会注意到\makeatletter...\makeatother
使用了 。这是因为我使用了。如果您想避免使用 ,\two@digits
可以使用\two@digits{\the\month}
和创建另一个命令。\two@digits{\the\day}
@
最重要的变化是包含etoolbox
包并修改filter test
内容。基本上,您有三个数字,可以将它们与今天的日期进行比较。比较在内部完成\ifboolexpr
。有三个块:
- 如果年份大于当前年份,则日期大于
- 如果年份等于(今天),但月份更大,则日期更大
- 如果年份和月份相等(与今天相同),但日期较大,则日期较大
所有其他条件都表明从文件中读取的日期.csv
要么相同,要么时间更早(即更早)。所以,它们不会出现。
最终的输出如下图所示。(您会注意到文件内容中的第四个数据条目没有出现,因为它早于今天的日期)。