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編集:提案された解決策は私の場合には十分です。しかし、それでも、マクロがすぐに展開されない内部の\input{}'でマクロを定義できるようにしたいと思います。つまり、\def\mymacro{\input{file}}'\input'. It seems thatにコードがある場合、\names'は配列として理解されません。同様にfile.tex', that I want to plugin in a new macro,\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

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

コードは\input{file}' in「newfile.tex」として保存されますが、「file.tex」の内容は保存されません。入力を強制的に拡張する方法をご存知の方はいらっしゃいますか?

答え1

csv ファイル全体をインポートする代わりに、行ごとに読み取ることができます。このためのパッケージはいくつかありますが、ここでは を使用しますcsvsimple。このファイルは、この例のためにすべてを 1 つのファイルにまとめるために環境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}

関連情報