数据工具按什么分组?

数据工具按什么分组?

我尝试显示一项调查的结果,其中两个不同班级的学生可以选择他们最喜欢的科目。在结果表中,我找到姓氏、名字、班级 ID、科目。ff14.txt我使用的文件中的数据如下所示:

ClassID; Schueler_Name; Schueler_Vorname; Subject
5a; Stiner; Markus; Big Band
3c; Meier; Stefan; Latein
5b; Muggli; Elena; Instrument
3b; Strang; Flurin; Band
3b; Nomer; Ulrike; Big Band

现在我想按班级对结果进行排序,然后显示该班级所有学生及其选择的最喜欢的科目。

在使用之前,我做过类似的事情nlatexdb,其中​​我使用了嵌套构造。但是,当我尝试将相同的代码应用于时,datatool我得到了非常不同的结果。在 PDF 中,班级没有分组,而是显示了 27 次(与班级中的学生人数一样多)。因此,生成的 PDF 由 27 个表组成,每个表包含 27 名学生。但我想要的是 2 个表(有 2 个班级),其中包含相应班级的所有学生。

我的 MWE:

\documentclass[12pt]{article}

\usepackage{babel, fixltx2e}
\usepackage{xltxtra}
\usepackage{xunicode}
\usepackage{float}
\usepackage{datatool}

\DTLsetseparator{;} 
\DTLloaddb{anmeldungen}{ff14.txt}

\begin{document}

\DTLforeach{anmeldungen}{\class=ClassID}{

\subsection*{Klasse \class}


\begin{tabular}{ll} \hline
\textbf{Name} & \textbf{Vorname} 
\DTLforeach{anmeldungen}{\fn=Schueler_Vorname, \ln=Schueler_Name}{\DTLiffirstrow{\\ \hline}{\\  }
\ln & \fn   }  \\ \hline \hline
\end{tabular}


\begin{flushright}
\DTLsavelastrowcount{\n}
\n\ Anmeldungen.
\end{flushright}

}

答案1

下面的例子首先使用获取数据工具数据库中特定列的所有不同值仅提取唯一的ClassIDs。然后使用以下方法处理唯一条目列表etoolboxClassID,在将其设置之前收集匹配的表行tabular

在此处输入图片描述

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{ff14.txt}
ClassID; Schueler_Name; Schueler_Vorname; Subject
5a; Stiner; Markus; Big Band
3c; Meier; Stefan; Latein
5b; Muggli; Elena; Instrument
3b; Strang; Flurin; Band
3b; Nomer; Ulrike; Big Band
\end{filecontents*}

\usepackage{datatool, etoolbox}

\DTLsetseparator{;} 
\DTLloaddb{anmeldungen}{ff14.txt}

\begin{document}

% Taken from https://tex.stackexchange.com/q/108712/5764
\newcommand*{\uniqueclass}{}
\newcommand{\csvlistsep}{\renewcommand{\csvlistsep}{,}}
\DTLforeach*{anmeldungen}{\Class=ClassID}{%
  \expandafter\DTLifinlist\expandafter{\Class}{\uniqueclass}%
  {}% do nothing, already in list
  {% add to list
    \ifdefempty{\uniqueclass}%
    {\let\uniqueclass\Class}% first element of list
    {% append to list
      \eappto\uniqueclass{,\Class}%
    }%
  }%
}

\newcommand{\nextrow}{}
\renewcommand{\do}[1]{%
  \subsection*{Klasse #1}
  \renewcommand{\nextrow}{}
  \begin{tabular}{ll}
    \hline
    \textbf{Name} & \textbf{Vorname} \\ \hline
    \DTLforeach{anmeldungen}
      {\class=ClassID, \fn=Schueler_Vorname, \ln=Schueler_Name}
      {\ifnum\pdfstrcmp{#1}{\class}=0 
         \eappto\nextrow{\ln \noexpand& \fn \noexpand\\}% Collect rows
       \fi}%
      \nextrow % Print table rows
    \hline \hline
  \end{tabular}
}

\expandafter\docsvlist\expandafter{\uniqueclass}

\end{document}

相关内容