PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datatool -> Zellen auslesen und Variablen zuweisen



ionas
08-03-2017, 10:47
Hallo!

Ich erstelle gerade eine Vorlage, mit der mehrere Nutzer arbeiten werden, die Latex nicht kennen / bedienen können.
Als Datenübergabeschnittstelle habe ich mir eine CSV-Datei überlegt, in der sämtliche Definitionen getätigt werden, damit keiner im Code rumfuhrwerkt.
Ich habe zwei Spalten und viele Zeilen. In der ersten Spalte steht die Bezeichnung und in der zweiten Spalte der Wert.

Name Hans
Wohnort Berlin

etc.

ich würde nun gerne folgendes tun:
Eine Variable in Tex erzeugen aus der Bezeichnung und dem Namen der CSV-Datei: Also die Variablen heißen dann: csvnameName und csvnameWohnort.
Die Variablen sollen nun mit dem Wert der Nachbarspalte befüllt werden. Also: csvnameName = Hans, csvnameWohnort = Berlin.
Mit den Variablennamen möchte ich dann in Tex weitere Sachen anstellen. Ich würde auch ungerne Hart auf die Zellen verweisen (also Var1 = Spalte 2, Zelle 1),
da in Zukunft vielleicht noch etwas eingefügt wird und ich so mit der von mir angestrebten Lösung flexibler bin.

Ist das möglich und zielführend? Kennt ihr vielleicht bessere Möglichkeiten um Latex mit Daten zu versorgen?

Vielen Dank!

ionas
08-03-2017, 12:46
Ich habe folgenden Code geschrieben:

\documentclass{scrartcl}
\usepackage[ngerman]{babel} %Bild statt Figure, Tabelle statt Table

\usepackage{datatool} %Daten aus CSV lesen
%\DTLnewdbonloadfalse
\DTLsetseparator{,} %Trennzeichen zwischen Werten in den CSV Dateien

\DTLloaddb{Test}{Unbenannt1.csv}
\begin{document}

\DTLforeach{Test}{\Bezeichnung=Bezeichnung,\Wert=W ert}
{
\newcommand{\Bezeichnung}{\Wert}
}

\end{document}


Ich bekomme die Fehlermeldung, dass der \newcommand bereits existiert. Ich dachte, er geht jede Zeile durch und beschreibt die \Bezeichnung und den \Wert immer mit den Informationen aus der Zeile ...
Das scheint aber nicht der Fall zu sein. :-(

u_fischer
08-03-2017, 13:36
Ohne Datei zu kennen, kann man es nicht testen. Aber bist du dir sicher, dass du genug LaTeX kannst, um eine Vorlage für andere zu schreiben?

ionas
08-03-2017, 14:07
Hallo Ulrike,

Es wird kein kompliziertes Dokument. Es soll jedoch von Personen, die noch nie Latex-Code gesehen haben mit einigen Textblöcken versehen werden.
Das traue ich mir schon zu. ;-)
Die csv-Datei ist ein Dummy. Z. B.

Name1, Wert1
Name2, Wert2

u_fischer
08-03-2017, 18:03
Nun, du solltest natürlich schon verstehen, warum

\newcommand\Name1{Wert1} \newcommand\Name2{Wert2}
einen Fehler gibt.

ionas
09-03-2017, 07:30
Hallo,

in deiner Antwort, fehlen natürlich die ersten {}.
Nun, dank Hilfe anderenorts funktioniert es nun. Falls es jemanden interessiert:
\value wird bereits von Latex bei der Definition von Countern verwendet. Diese Variable sollte also nicht verwendet werden.
Da das Paket Datatool auch Etools lädt kann man das ganze durch den Befehl \cslet einfach lösen.
Folgender Code funktioniert:


\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}

klops
09-03-2017, 07:33
Du definierst in einer Schleife denselben Befehl immer wieder neu. Die Fehlermeldung lautet dabei auch kaum, dass \newcommand bereits existiert. Schau noch einmal genauer hin.

Edit: Ja, das neue Beispiel ist besser. Eine tabellarische Ausgabe kann man mit datatool aber auch machen, ohne dass man für jede Zeile explizit ein Makro definiert. Auch deine nicht tabellarische Ausgabe könnte man unmittelbar in die Schleife packen und so die zusätzlichen Makros einsparen.

u_fischer
09-03-2017, 09:50
in deiner Antwort, fehlen natürlich die ersten {}.


Nein. Die habe ich absichtlich weggelassen. Die sind nämlich erstens optional und zweitens bekommst du ohne die Klammern eine besseren (Fehler)-Rückmeldung. Du kannst ja mal überlegen, was hier wohl als Ausgabe rauskommt:


\documentclass{article}
\begin{document}
Definition: \newcommand{\Name1}{Wert1} \newcommand{\Name2}{Wert2}

Testen: \Name1 \Name2
\end{document}