我正在寻找一个可能性,从结构如下的数据开始
1,a
2,a
2,a
2,a
3,a
3,a
4,a
4,a
4,a
4,a
5,a
5,a
6,a
6,a
7,a
追随你的脚步
1 1
2 3
3 2
4 4
5 2
6 2
7 1
(我们只会说一句话,其他的都可以给...)
我读了 datatool 包,但我发现它不能改变形状,因此我只能根据以下说明进行操作......
加载数据库.... 在数据库中,根据最低搜索计数器,查找第一个错误的数据库...但是,新的数据库中出现了新的数据库....并且计数器说明....
然后程序再从那里开始,直到找到零数据....
受保护数据库排序...嗯....
在景观范围内;我无法两次使用 datatool 的内部部分来实现...
LG 金纳斯
答案1
\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.csv}
1,a
2,a
2,a
2,a
3,a
3,a
4,a
4,a
4,a
4,a
5,a
5,a
6,a
6,a
7,a
\end{filecontents*}
\DTLloaddb[noheader,keys={num}]{raw}{\jobname.csv}
\DTLnewdb{hist}
\newcounter{numcnt}
% fill table "hist"
\newcommand*{\SaveRow}{%
\ifnum\value{numcnt}>0 %
\DTLnewrow{hist}%
\begingroup
\dtlexpandnewvalue
\DTLnewdbentry{hist}{num}{\oldnum}%
\DTLnewdbentry{hist}{count}{\the\value{numcnt}}%
\endgroup
\fi
}%
\newcommand*{\oldnum}{}%
\setcounter{numcnt}{0}%
\DTLforeach*{raw}{\num=num}{%
\ifx\oldnum\num
\stepcounter{numcnt}%
\else
\SaveRow
\setcounter{numcnt}{1}%
\let\oldnum\num
\fi
}%
\SaveRow
% write table "hist" with header
\DTLsetdelimiter{,}
\DTLsavedb{hist}{\jobname.hist}
\begin{document}
Hello World% nothing would be written without output page
\end{document}
结果是数据库hist
或文件\jobname.hist
:
num,count
1,1
2,3
3,2
4,4
5,2
6,2
7,1
评论:
- 在写入文件时,包
datatool
不使用\immediate
,因此数据库文件会在下一页输出时写入,而在最后一页之后根本不会写入。
变化,写入\jobname.hist
没有标题的文件:
\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.csv}
1,a
2,a
2,a
2,a
3,a
3,a
4,a
4,a
4,a
4,a
5,a
5,a
6,a
6,a
7,a
\end{filecontents*}
\DTLloaddb[noheader,keys={num}]{raw}{\jobname.csv}
\DTLnewdb{hist}
\newcounter{numcnt}
% fill table "hist" and manually write it
\makeatletter
\immediate\openout\@dtl@write=\jobname.hist\relax
% reusing datatool's write handle
\newcommand*{\SaveRow}{%
\ifnum\value{numcnt}>0 %
\DTLnewrow{hist}%
\begingroup
\dtlexpandnewvalue
\DTLnewdbentry{hist}{num}{\oldnum}%
\DTLnewdbentry{hist}{count}{\the\value{numcnt}}%
\immediate\write\@dtl@write{\oldnum,\the\value{numcnt}}%
\endgroup
\fi
}%
\newcommand*{\oldnum}{}%
\setcounter{numcnt}{0}%
\DTLforeach*{raw}{\num=num}{%
\ifx\oldnum\num
\stepcounter{numcnt}%
\else
\SaveRow
\setcounter{numcnt}{1}%
\let\oldnum\num
\fi
}%
\SaveRow
\immediate\closeout\@dtl@write
\makeatother
\begin{document}
\end{document}
结果再次是数据库hist
和文件\jobname.hist
,但这次写入的文件没有标题:
1,1
2,3
3,2
4,4
5,2
6,2
7,1
评论:
- 包的(内部)写入句柄
datatool
被重用,因为写入句柄是一种非常有限的资源。 - 数据库立即写入(
\immediate\write
)并且不会延迟到下一页输出。