数据工具-用第二行的值填充变量(第一行中的名称)

数据工具-用第二行的值填充变量(第一行中的名称)

我有一个有两行的 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}定义命令。在这种情况下,您想要从 获得控制序列名称,并从 的定义中获得替换文本,因此您真正需要的是,它创建一个由 的定义形成的新命令并将其分配给 的定义(因此它在循环的下一次迭代中重新定义后保留正确的定义)。\Voltage14 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}

电压:14 V。电流:1 A。更多文本:这里写了一些其他内容。日期:2017/03/08。

答案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}

在此处输入图片描述

相关内容