以下代码按我预期的方式工作。
\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 的答案相同。