如何删除所有 DTLrowi 大于 10 的行?

如何删除所有 DTLrowi 大于 10 的行?

我不断收到更新的文件 ( year.csv),该文件应按如下所示排序。但只应显示前 10 行(排序后)。

MWE 可以工作,我可以省略所有大于DTLrowi10 的行,但行仍然存在。

在此处输入图片描述

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{year.csv}
1984|1
1998|1
1999|2
2001|2
2002|2
2003|1
2004|2
2005|20
2006|42
2007|64
2008|90
2009|122
2010|130
2011|149
2012|164
2013|123
2014|184
2015|216
2016|204
2017|185
2018|219
2019|190
2020|25
\end{filecontents*}
\usepackage{booktabs}
\usepackage{datatool}
\DTLsetseparator{|}
\DTLloaddb[noheader,keys={year,quantity}]{year}{year.csv}
\DTLsort{quantity=descending}{year}
\begin{document}

\begin{tabular}{ll}
Year & Quantity
\DTLforeach*{year}
{\year=year,%
 \quantity=quantity}
{
\\\ifnum\value{DTLrowi}>10
\DTLremovecurrentrow % <<<< ?!?!?!??!!? error
\else
\year & \quantity\fi
}
\\\bottomrule
\end{tabular}

\end{document}

添加\DTLremovecurrentrow条件会导致错误,并且日志显示

!包 datatool 错误:\DTLreplaceentryforrow 不能在 \DTLforeach* 内使用。

但在文档第 75 页上说

以下命令可用于 \DTLforeach 循环主体,3 以编辑循环的当前行。

答案1

在创建表时删除行是没有意义的:删除是本地的,不会影响数据库。只需忽略这些行即可。

另外,您不能在与开始条件不同的单元格中结束条件,因此您需要在发出之前删除条件\\

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{year.csv}
1984|1
1998|1
1999|2
2001|2
2002|2
2003|1
2004|2
2005|20
2006|42
2007|64
2008|90
2009|122
2010|130
2011|149
2012|164
2013|123
2014|184
2015|216
2016|204
2017|185
2018|219
2019|190
2020|25
\end{filecontents*}
\usepackage{booktabs}
\usepackage{datatool}
\DTLsetseparator{|}
\DTLloaddb[noheader,keys={year,quantity}]{year}{year.csv}
\DTLsort{quantity=descending}{year}

\makeatletter
\let\gobble\@gobble
\let\firstofone\@firstofone
\makeatother

\begin{document}

\begin{tabular}{ll}
Year & Quantity
\DTLforeach*{year}{\year=year,\quantity=quantity}{%
  \ifnum\value{DTLrowi}>10
    \expandafter\gobble
  \else
    \expandafter\firstofone
  \fi
  {\\ \year & \quantity}%
}
\\\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

答案2

正如评论中所建议的,如果您对R和有所了解,那么这相当简单knitr

姆韦

文件test.Rnw

\documentclass{article}
\usepackage{booktabs}
\begin{document}
<<table, echo=F,results='asis'>>=
library(xtable)
df <- read.csv("year.csv")
print(xtable(head(df,10)),include.rownames=F,booktabs=T)
@
\end{document}

文件年.csv

Year, Quantity
1984, 1
1998, 1
1999, 2
2001, 2
2002, 2
2003, 1
2004, 2
2005, 20
2006, 42
2007, 64
2008, 90
2009, 122
2010, 130
2011, 149
2012, 164
2013, 123
2014, 184
2015, 216
2016, 204
2017, 185
2018, 219
2019, 190
2020, 25

答案3

pgfplotstable有内置功能。你可以使用例如

row predicate/.code={\ifnum#1>9\relax
  \pgfplotstableuserowfalse
\fi

此外,您还可以访问完整的 pgf 机制,以定义更复杂的选择机制。另外,我认为您加载是booktabs有原因的。可以添加其规则,例如

every head row/.style={before row=\toprule,after row=\midrule}, 
every last row/.style={after row=\bottomrule}]\loadedtable

梅威瑟:

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{year.csv}
1984&1
1998&1
1999&2
2001&2
2002&2
2003&1
2004&2
2005&20
2006&42
2007&64
2008&90
2009&122
2010&130
2011&149
2012&164
2013&123
2014&184
2015&216
2016&204
2017&185
2018&219
2019&190
2020&25
\end{filecontents*}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotstableread[col sep=&,header=false]{year.csv}\loadedtable
\begin{document}
\pgfkeys{/pgf/number format/.cd,set thousands separator={}}
\pgfplotstabletypeset[display columns/0/.style={column name=Year},
display columns/1/.style={column name=Quantity,column type=l},
sort=true,sort key={[index]1},sort cmp=int >,
row predicate/.code={\ifnum#1>9\relax
  \pgfplotstableuserowfalse
\fi},
every head row/.style={before row=\toprule,after row=\midrule}, 
every last row/.style={after row=\bottomrule}]\loadedtable
\end{document}

在此处输入图片描述

相关内容