Создание массива строк из CSV-файла

Создание массива строк из CSV-файла

Я хотел бы создать несколько именных бейджей с помощью цикла. У меня есть электронная таблица с именами и принадлежностями, которую я сохраняю в файле names.csv следующим образом

"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"

Я могу скопировать содержимое names.csv в массив строк и использовать цикл для восстановления записей. Ниже приведен пример рабочего кода, создающего вывод Surname2:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\def\names{{"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"}}

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

Я могу использовать эту идею для создания сотен именных бейджей в цикле. Но вместо того, чтобы записывать весь список в файл .tex, я хотел бы вызвать напрямую мой файл names.csv. Я использовал измененный код

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\def\names{{\input{names.csv}}}

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

что, по-видимому, входит в бесконечный цикл. Я понял, что это \input{}работает так же, как копирование-вставка, но, похоже, это не так. Конечно, я могу работать в электронной таблице, а затем копировать-вставлять содержимое файла names.csv, но я хотел бы понять, что происходит. Есть какие-нибудь подсказки?

PS edit: Предложенное решение достаточно для моего случая. Но все же я хотел бы иметь возможность определять макросы с \input'. It seems that\input{}' внутри макроса, который не будет немедленно расширен. Я имею в виду, если у меня есть какой-то код в file.tex', that I want to plugin in a new macro,\def\mymacro{\input{file}}', который сохранит \mymacro' as '\input{file}' and will only look what's inside the file when I call the macro in the document. That's why in the previous example\names', не понимается как массив. Таким же образом

\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}

сохранит код \input{file}' innewfile.tex', но не содержимое в `file.tex'. Есть ли у кого-нибудь идеи, как заставить input расширяться?

решение1

Вместо импорта всего csv-файла вы можете прочитать его построчно. Для этого есть несколько пакетов, здесь я использую csvsimple. Файл names.csvсоздается средой filecontents, чтобы иметь все в одном файле для этого примера.

\documentclass{article}
\usepackage{filecontents}
%% Create file
\begin{filecontents*}{names.csv}
Name1, Surname1, Affiliation1
Name2, S. Urname2, A f filiation2
Name3, Surname3, Affiliation3
Name4, Surname4, Affiliation4
Name5, Surname5, Affiliation5
\end{filecontents*}
\usepackage{tikz}
\usepackage{csvsimple}
\begin{document}
List of participants:
\begin{itemize}
  \csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
  \item \name\ \surname\ at \affiliation
  }
\end{itemize}

Badges:\newline
\csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
  \begin{tikzpicture}
    \draw[clip] (0,0) rectangle (6,4);
    \node at (3,2){\Large\name\ \surname};
    \node at (3,1.3){\affiliation};
    %% Logo
    \fill[color=red!40] (0.7,3.3) circle(1);
    \node[fill=green!40,opacity=0.5,rounded corners=5pt,anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
    \node[anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
  \end{tikzpicture}
}

\end{document}

введите описание изображения здесь

решение2

Пакет readarrayнастроен на преобразование данных файлов в массивы.

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{names.csv}
Name1,Surname1,Affiliation1,
Name2,Surname2,Affiliation2,
Name3,Surname3,Affiliation3
\end{filecontents*}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\usepackage{readarray}
\readarraysepchar{,}
\begin{document}

\readdef{names.csv}\namedata

\readarray\namedata\names[-,\ncols]

\names[2,2] and \names[3,3]
\end{document}

введите описание изображения здесь

решение3

Вам нужно определить \namesтак, чтобы его определение было содержимым файла. Это означает, что требуется некоторое расширение:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}

\begingroup
\makeatletter
\endlinechar=-1\relax
\everyeof{\noexpand}\relax
\edef\x{\endgroup\def\noexpand\names{{\@@input names.csv }}}\x

\begin{document}

\pgfmathparse{\names[4]}\pgfmathresult

\end{document}

Связанный контент