データツールデータベース内の特定の列のすべての異なる値を取得する

データツールデータベース内の特定の列のすべての異なる値を取得する

データベース内の特定の列のすべての異なる値を取得するにはどうすればよいですかdatatool? 例として、データベースに読み込まれる次のテーブルがありますdatatool

Name,Town,Age
Adam,Xcity,20
Berta,Ytown,30
Cesar,Ztington,40
Dora,Ztington,20
Emil,Ytown,30
Franz,Ytown,20

Xcity, Ytown,Ztingtonここで、データベース内のすべての町 ( ) と、データベース内のすべての年齢 ( 20,30,40) のリストを重複なしで取得し、後で または を使用して再利用できるようにマクロなどに保存したいdatatoolと思いますpgffor

答え1

datatoolには、要素が指定されたコンマ区切りのリストに含まれているかどうかを確認できるマクロがあります\DTLifinlist。したがって、次のように、すべての町または年齢のリストを作成するときにこれを使用できます。

\documentclass{article}

\usepackage{etoolbox}
\usepackage{datatool}

\begin{filecontents}{test.csv}
Name,Town,Age
Adam,Xcity,20
Berta,Ytown,30
Cesar,Ztington,40
Dora,Ztington,20
Emil,Ytown,30
Franz,Ytown,20
\end{filecontents}

\DTLloaddb{data}{test.csv}

\begin{document}

\newcommand*{\uniquetowns}{}
\newcommand*{\uniqueages}{}

\DTLforeach*{data}{\Town=Town,\Age=Age}{%
  \expandafter\DTLifinlist\expandafter{\Town}{\uniquetowns}%
  {}% do nothing, already in list
  {% add to list
    \ifdefempty{\uniquetowns}%
    {\let\uniquetowns\Town}% first element of list
    {% append to list
      \eappto\uniquetowns{,\Town}%
    }%
  }%
  % Similarly for age
  \expandafter\DTLifinlist\expandafter{\Age}{\uniqueages}%
  {}% do nothing, already in list
  {% add to list
    \ifdefempty{\uniqueages}%
    {\let\uniqueages\Age}% first element of list
    {% append to list
      \eappto\uniqueages{,\Age}%
    }%
  }%
}

List of unique towns: \uniquetowns.

List of unique ages: \uniqueages.
\end{document}

結果:

結果画像

関連情報