数据转换(datatool,fp)

数据转换(datatool,fp)

我正在寻找一个可能性,从结构如下的数据开始

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)并且不会延迟到下一页输出。

相关内容