我不断收到更新的文件 ( year.csv
),该文件应按如下所示排序。但只应显示前 10 行(排序后)。
MWE 可以工作,我可以省略所有大于DTLrowi
10 的行,但行仍然存在。
\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}