csvsimple 过滤问题

csvsimple 过滤问题

以下代码按我预期的方式工作。

\documentclass{scrartcl}
\usepackage{csvsimple,filecontents}

\begin{document} 

\begin{filecontents*}{chunk.csv}
AAAA,aaaaa
BBBB,bbbbb
CCCC,ccccc
DDDD,ddddd
EEEE,eeeee
FFFFF,fffffff
GGGGG,ggggg
HHHHHH,hhhhh
\end{filecontents*}

\csvreader[no head,before filter= \ifthenelse{\thecsvrow<4}{\csvfilteraccept}{\csvfilterreject}]{chunk.csv}{}{%
\begin{itemize} 
\item \csvcoli , \csvcolii
\end{itemize}}

\end{document} 

当我将过滤条件从“ \thecsvrow<4”更改为“ \thecsvrow=4”或“ \thecsvrow>4”时,代码中断。如能提供如何实现此功能的提示,我将不胜感激。

答案1

由于过滤器是全局设置的,因此应在设置项目时执行每个项目的测试,而不是在标题中执行。从csvsimple 文档

\csvfilterreject

所有后续数据行都将被忽略。此命令将覆盖所有先前的过滤器设置。

在此处输入图片描述

\documentclass{article}
\usepackage{csvsimple,filecontents}% http://ctan.org/pkg/{csvsimple,filecontents}

\begin{document} 

\begin{filecontents*}{chunk.csv}
AAAA,aaaaa
BBBB,bbbbb
CCCC,ccccc
DDDD,ddddd
EEEE,eeeee
FFFFF,fffffff
GGGGG,ggggg
HHHHHH,hhhhh
\end{filecontents*}

\begin{itemize}
\csvreader[no head]{chunk.csv}{}{\ifnum\value{csvrow}<4\relax\item \csvcoli, \csvcolii\fi}
\end{itemize}

\hrulefill

\begin{itemize}
\csvreader[no head]{chunk.csv}{}{\ifnum\value{csvrow}=4\relax\item \csvcoli, \csvcolii\fi}
\end{itemize}

\hrulefill

\begin{itemize}
\csvreader[no head]{chunk.csv}{}{\ifnum\value{csvrow}>4\relax\item \csvcoli, \csvcolii\fi}
\end{itemize}

\end{document}

低级条件用于(不)打印每个项目,测试的值csvrow


这是使用datatool。界面非常相似,因此转换应该不是问题:

在此处输入图片描述

\documentclass{article}
\usepackage{datatool,filecontents}% http://ctan.org/pkg/{datatool,filecontents}

\begin{document} 

\begin{filecontents*}{chunk.csv}
AAAA,aaaaa
BBBB,bbbbb
CCCC,ccccc
DDDD,ddddd
EEEE,eeeee
FFFFF,fffffff
GGGGG,ggggg
HHHHHH,hhhhh
\end{filecontents*}

\DTLloaddb[noheader,keys={first,last}]{chunk}{chunk.csv}
\begin{itemize}
  \DTLforeach{chunk}{\First=first,\Last=last}{\ifnum\value{DTLrowi}<4\relax\item \First, \Last\fi}
\end{itemize}

\hrulefill

\begin{itemize}
  \DTLforeach{chunk}{\First=first,\Last=last}{\ifnum\value{DTLrowi}=4\relax\item \First, \Last\fi}
\end{itemize}

\hrulefill

\begin{itemize}
  \DTLforeach{chunk}{\First=first,\Last=last}{\ifnum\value{DTLrowi}>4\relax\item \First, \Last\fi}
\end{itemize}

\end{document}

低级条件用于(不)打印每个项目,测试的值DTLrowi

答案2

计数器csvrow用于公认输入行(过滤后)。如果您想要计算输入文件的行数以在其上构建过滤器,则应使用计数器csvinputline

\documentclass{article}
\usepackage{csvsimple,filecontents}

\begin{document}

\begin{filecontents*}{chunk.csv}
AAAA,aaaaa
BBBB,bbbbb
CCCC,ccccc
DDDD,ddddd
EEEE,eeeee
FFFFF,fffffff
GGGGG,ggggg
HHHHHH,hhhhh
\end{filecontents*}

\begin{itemize}
\csvreader[no head,filter={\value{csvinputline}<4}]{chunk.csv}{}{\item \csvcoli, \csvcolii}
\end{itemize}

\hrulefill

\begin{itemize}
\csvreader[no head,filter={\value{csvinputline}=4}]{chunk.csv}{}{\item \csvcoli, \csvcolii}
\end{itemize}

\hrulefill

\begin{itemize}
\csvreader[no head,filter={\value{csvinputline}>4}]{chunk.csv}{}{\item \csvcoli, \csvcolii}
\end{itemize}

\end{document}

结果输出与@Werner 的答案相同。

相关内容