将 csv 文件中的日期转换为数字

将 csv 文件中的日期转换为数字

我尝试仅显示 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要么相同,要么时间更早(即更早)。所以,它们不会出现。

最终的输出如下图所示。(您会注意到文件内容中的第四个数据条目没有出现,因为它早于今天的日期)。

csvsimple with filter to remove current/older dates but keep future dates

相关内容