One way to do this (if I understand correctly what you want) is to create quasi-arrays of control-sequence (command) names with numbers in them so you can loop through the array using a counter.
Here the command \newperson takes three arguments: a pseudonymn, real name, and role for each person. It stores each of these in an array according to the current person number (so for example, \person0pseudonym). It also creates a control sequence from the pseudonym, which expands to the array number of that person. Then there are command to access each person's data individually or to get a list of all people. You could customize the format of \listperson and \listpeople to be a table or some other format.
The \ID command is an example of how you might refer to the names in the text so that you can control whether the real name shows or not. You just say whether you want the result of this command to output the real name or the pseudonym from the array.
\documentclass{article}
% Add a person to the list of people
% (implemented as an "array" of control-sequence names (person0, person1, etc.)
\newcounter{person}
% #1 Pseudonym, #2 Real Name, #3 Role
\newcommand{\newperson}[3]{%
\expandafter\gdef\csname person\theperson pseudonym\endcsname{#1}%
\expandafter\gdef\csname person\theperson name\endcsname{#2}%
\expandafter\gdef\csname person\theperson role\endcsname{#3}%
\expandafter\edef\csname #1\endcsname{\theperson}%
\stepcounter{person}%
}
% Fetch specific data from member of list of people
% For the next four commands, #1 csname based on pseudonym, or personID number
\newcommand{\pseudonym}[1]{%
\csname person#1pseudonym\endcsname%
}
\newcommand{\realname}[1]{%
\csname person#1name\endcsname%
}
\newcommand{\personrole}[1]{%
\csname person#1role\endcsname%
}
% List all the data for one person
% (formatting could be customized)
\newcommand{\listperson}[1]{%
\pseudonym{#1}: \realname{#1} (\personrole{#1})%
}
% List all the data for all the people
\newcounter{currentperson}
\newcommand{\listpeople}{%
\setcounter{currentperson}{0}%
\begin{itemize}
\loop
\item \listperson{\thecurrentperson}
\stepcounter{currentperson}%
\ifnum\value{currentperson} < \value{person}
\repeat%
\end{itemize}%
}
% Use the \ID command to refer to person in text using their name as a control sequence (e.g., \ID{\Jenny})
\newcommand{\userealnames}{\let\ID\realname}
\newcommand{\usepseudonyms}{\let\ID\pseudonym}
\usepseudonyms % default is not to show real names in the transcript
\begin{document}
% You could input a list like this from a separate file
\newperson{Jenny}{Jane Doe}{Line cook}
\newperson{Frances}{John Doe}{Cashier}
\newperson{Ralph}{Jim Doe}{Manager}
Here is the information on the first person: \listperson{\Jenny}.
\subsection*{List of People}
\listpeople
\subsection*{Pseudonyms}
\ID{\Jenny} accused \ID{\Frances} of stealing money.
\ID{\Ralph} mediated their dispute and determined that no money was stolen.
\subsection*{Now with Real Names}
\userealnames
\ID{\Jenny} accused \ID{\Frances} of stealing money.
\ID{\Ralph} mediated their dispute and determined that no money was stolen.
\end{document}
