我有一个有两行的 csv。第一行包含名称,第二行包含值。我想创建变量(用 newcommand 尝试),这些变量具有第一行的名称,并使用第二行的值定义它们。最终的 csv 将包含大约 50 行。
这是我的代码:它似乎一次又一次地覆盖了同一个变量......
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{filecontents}
\usepackage{datatool}
\DTLsetseparator{,}
\begin{filecontents*}{Unnamed1.csv}
Voltage , 14 V
Current , 1 A
MoreText , something more is written here
Date , 2017/03/08
\end{filecontents*}
\DTLloaddb{Test}{Unnamed1.csv}
\begin{document}
\DTLforeach{Test}{\name=name,\value=value}
{
\newcommand{\name}{\value}
}
\end{document}
答案1
(重写答案现在问题更清楚了。)
问题在于
\DTLforeach{Test}{\name=name,\value=value}
{
\newcommand{\name}{\value}
}
是 ,\name
在每次迭代中通过赋值反复重新定义。这也只是尝试定义\name
而不是构造由 的定义形成的控制序列\name
。该etoolbox
包提供了定义给定名称(不带初始反斜杠)的命令的方法。例如,使用替换文本\csdef{Voltage}{14 V}
定义命令。在这种情况下,您想要从 获得控制序列名称,并从 的定义中获得替换文本,因此您真正需要的是,它创建一个由 的定义形成的新命令并将其分配给 的定义(因此它在循环的下一次迭代中重新定义后保留正确的定义)。\Voltage
14 V
\name
\value
\cslet{\name}{\value}
\name
\value
\value
几点注意事项:\value
已由 LaTeX 内核定义(它获取计数器的值),因此最好使用其他命令名称(例如\Value
),以避免破坏任何内容。您还需要修剪虚假空间从数据来看。
更新的 MWE:
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{Unnamed1.csv}
name,value
Voltage,14 V
Current,1 A
MoreText,something more is written here
Date,2017/03/08
\end{filecontents*}
\usepackage[ngerman]{babel}
\usepackage{datatool}
\DTLsetseparator{,}
\DTLloaddb{Test}{Unnamed1.csv}
\begin{document}
\DTLforeach{Test}{\Name=name,\Value=value}
{%
\cslet{\Name}{\Value}%
}
Voltage: \Voltage.
Current: \Current.
MoreText: \MoreText.
Date: \Date.
\end{document}
答案2
像这样的东西,加上readarray
包裹就够了吗?
修订
\documentclass{article}
\usepackage{readarray}[2016-11-07]
\usepackage{filecontents}
\begin{filecontents*}{myfile.dat}
First, Last, Birthday
John, Doe, 01/01/68
\end{filecontents*}
\newcounter{mycount}
\newcommand\assigndat[1]{%
\readarraysepchar{,}%
\readdef{#1}\mydata%
\readarray*\mydata\myarray[-,\ncols]%
\setcounter{mycount}{0}%
\whiledo{\themycount<\ncols}{%
\stepcounter{mycount}%
\edef\tmp{\myarray[1,\themycount]}%
\expandafter\expandafter\expandafter\xdef\expandafter\csname\tmp\endcsname{%
\myarray[2,\themycount]}%
}%
}
\begin{document}
\assigndat{myfile.dat}
\First
\Last
\Birthday
\end{document}
原始答案
\documentclass{article}
\usepackage{readarray}[2016-11-07]
\usepackage{filecontents}
\begin{filecontents*}{myfile}
First, Last, Birthday
John, Doe, 01/01/68
\end{filecontents*}
\newcommand\assigndat[1]{%
\edef\tmp{\myarray[1,#1]}
\expandafter\expandafter\expandafter\def\expandafter\csname\tmp\endcsname{\myarray[2,#1]}
}
\begin{document}
\readarraysepchar{,}
\readdef{myfile.tex}\mydata
\readarray*\mydata\myarray[-,\ncols]
Column 3 title is ``\myarray[1,3]''.
Column 3 data is ``\myarray[2,3]''
\assigndat{1}\First
\assigndat{2}\Last
\assigndat{3}\Birthday
\end{document}