PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lyx, datatool und wo muss die .csv-Datei gespeichert sein



elektron
27-10-2010, 23:14
Hallo liebe LaTeX-Gemeinde,

so nochmal zu meinen Anliegen. Also ich finde LaTeX echt toll aber da ich nicht so nen script-coder bin, habe ich mich für den Zwischenweg mit Lyx entschieden. Wobei ich ehrlich gesagt langsam feststelle, dass wenn man sich etwas tiefer in die Materie einarbeitet um LaTeX-Code nicht drum rum kommt. Was ja nicht weiter tragisch ist, geht ja mit Lyx auch. Ist zwar ein mächtiges Gefummel manchmal, aber was tut man nicht alles aus Überzeugung.
Aber nun zum eigentlichen. Ich habe immer noch das Ziel mit Lyx, dem Packeten datatool und scrlttr2 nen Serienbrief zu erstellen. Ok man muß die .csv-Datei einlesen. Alles nicht das Problem mit den Befehlen. Nun scheint mir aber Lyx die Eigenheit zu haben, das pdf aus nen Temp-Ordner zu generieren. Was ja nicht weiter tragisch ist. Der Haken ist nur der, da liegt ja dummerweise meine .csv-Datei nicht drin. Jetzt die Frage wie löse ich das Problem bzw wie kann ich es umgehen? Ich will ja nicht jedes mal die Datei in nen Temp-Ordner kopieren, denn dann kann ich auch gleich die Adressen per Hand eintragen.
Bzw. wie verhält sich das mit dem Pfadangaben in Lyx (also den absoluten und relativen heißt das so?)?

Vielen Dank für eure Hinweise.

Gruß elektron

elektron
28-10-2010, 06:59
Guten Morgen,

so das Problem habe ich gelöst. Ach was für ein gutes Gefühl und das am frühen Morgen. Ok ich gebs zu das Problem war auch etwas trivial. Aber nichts desto trotz will ich euch daran teilhaben lassen. Also der Ansatz mit dem absoluten Pfad war schon richtig. Aber wenn man so blöd ist wie ich, nen backslash anstatt nen Schrägstrich verwendet dann kann es nichts werden. Wenn man sich an den allgemeingültigen Syntax hält wie Laufwerk/Verteichnis/Unterverzeichnis/Dateiname.Endung dann sollte es klappen. Also einfach aus der Adressleiste den Pfad kopieren und auf slash und backslash kontrollieren.
So nun auf zum nächsten Problem was auf mich wartet. Das ist die Fallunterscheidung zwischen einmal Herr oder Frau oder Damen und Herren und zum anderen wenn ein Postfach statt einer Straße vorhanden ist das das Postfach in die Adresse eingesetzt wird. Da ich aber in der Spalte Postfach nur die Nummer dieses Postfaches gespeichert habe (also nicht den Zusatz Postfach vor der jeweiligen Nummer) muss dieser dann einmal im Adressteil auftauchen und wenn er nicht gebraucht wird verschwinden.
Hat jmd Ideen wie man sowas geschickt löst. Habe schon hier im Forum Ansätze gefunden wie es mit If-Abfragen gelöst wurde. Gibt es auch ne Case-Variante? Wie habt ihr so etwas gelöst?

Vielen Dank.

Gruß elektron

elektron
28-10-2010, 19:50
Guten Abend,
So ich will euch mal an meine Gefummel etwas teilhaben lassen. Jetzt ist natürlich der Fall aufgetreten, dass meine csv-Datei bzw die Tabelle die in dieser Datei steckt nicht ganz homogen ist. Also heißt bei manchen Adresseinträgen habe ich eine Straße bei anderen ein Postfach und bei wieder anderen einen Firmenname. Also bleibt bei manchen Einträgen ein Feld leer und wird nur durch zwei Kommas getrennt. So hier mal den Tex code

\documentclass[a4paper]{scrlttr2}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{datatool}
\setkomavar{title}{Teilnahmebestätigung}

\begin{document}
\DTLloaddb{list}{datad3.csv}
\DTLforeach{list}{\first=vorname,\last=nachname,\a ddress=strasse,
\town=ort,\pf=postfach}{% Beginn Schleife

\begin{letter}{\first~\last \\ \address \\ \town \\ \pf}%
\opening{Sehr geehrte/r \first~\last,}%

Wir bestätigen Ihre Teilnahme am Foobar
Workshop in Musterstadt.

\setkomavar{fromname}{Das Organisationsteam}%
\closing{Mit freundlichen Grüßen}%
\end{letter}
}% Ende Schleife
\end{document}

Ist auch nicht mein Beispiel ist das aus der Texnischen Komödie glaub ich. So jetzt häng ich noch die csv-Datei an.
So wenn man jetzt bei einen Eintrag in der csv-Datei die Straße oder das Postfach wegläßt funktioniert der ganze Spaß nicht mehr.
Jetzt die Frage wie kann ich das umgehen bzw das Problem lösen.
Und wie erstelle ich dann gezielte Abfragen. Also ein Brief an die Firma bzw Herrn sowieso.
Ich hoffe auf eine rege Beteiligung. Aber ich seh schon ich bin der einzige Verrückte der so ein Sch... verzapft oder die Lösung ist zu trivial.

Also viel Spaß und Danke für die Mühe.

Gruß elektron

elektron
29-10-2010, 16:58
Hallo an alle,

Habe mal meinen Fehler eingegrenzt. Also es liegt nicht an der csv-Datei, die ich einlesen, will sonder daran. wie ich die Daten im Dokument anordnen will.
Und zwar wie bekomme ich es hin das ich die Strasse und den Ort mit Postleitzahl in ne eigene Zeile bekomme. Mit \\ funktioniert es leider nicht da schreibt er mir immer "! Undefined control sequence.
\scr@toaddress@var -> \strasse \ort "
Und das bedeutet was? Unten noch mal das Minimalbeispiel. Ich weiß das es jetzt sicher sehr trivial ist. Aber wenn man von dem was man macht so gar keine Ahnung hat, ist man für jeden Tipp dankbar. Quasi nen Instinktinformatiker bin ;-).

Gruß elektron


\documentclass[a4paper]{scrlttr2}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{datatool}
\setkomavar{title}{Teilnahmebestätigung}

\begin{document}
\DTLloaddb{list}{datad3.csv}
\DTLforeach{list}{\first=vorname,\last=nachname,\a ddress=strasse,
\town=ort,\pf=postfach}{% Beginn Schleife

\begin{letter}{\first~\last \\ \address \\ \town \\ \pf}%
\opening{Sehr geehrte/r \first~\last,}%

Wir bestätigen Ihre Teilnahme am Foobar
Workshop in Musterstadt.

\setkomavar{fromname}{Das Organisationsteam}%
\closing{Mit freundlichen Grüßen}%
\end{letter}
}% Ende Schleife
\end{document}

u_fischer
29-10-2010, 18:09
Dein Beispiel mit deiner Beispieldatei funktioniert bei mir (aktuelles miktex) tadellos.

Wenn einzelne Felder leer sind, musst du halt was unsichtbares in die entsprechende Zeile schreiben (\town\mbox{}) oder mit einem geeigneten if-Befehl die Zeile unterdrücken.

elektron
29-10-2010, 19:17
Vielen Dank für die Antwort. Ich denke das die Zeilen der csv-Datei nur die gleiche Spaltenanzahl haben müssen. Ob in den jeweiligen Spalten dann was steht ist meines Wissens (was natürlich nichts heißt) nicht entscheiden. Ich kann ja die Variablen hintereinander setzen.
\begin{letter}{\firma \vorname~\nachname\\ \strasse \postleitzahl~ \ort }%
Füge ich jetzt in den Code noch \\ ein um einen Zeilenumbruch zu erzwingen tritt der Fehler "! LaTeX Error: There's no line here to end." auf.

\begin{letter}{\firma \vorname~\nachname\\ \strasse \\ \postleitzahl~ \ort }%
Ich habe natürlich auch die veränderten Variablen in der csv angepaßt. Sie werden ja auch ohne \\ richtig eingelesen nur eben hintereinander in einer Zeile was aber für eine Adresse bißchen blöd ist.

Gruß elektron

msfox
29-10-2010, 21:34
Ich habe mit Lyx und datatool gleiches Problem. "Direkt" mit Latex kann ich auf die csv-Datei zugreifen, Lyx bringt aber einen Fehler. Wie oben geschrieben scheint es am Ort der csv-Datei zu liegen. Wenn man diesen absolut angibt, sollte es gehen. Ich hab aber nicht ganz verstanden, was mit "absolute" gemeint ist.
In den Beispielen ist die Angabe auch immer relativ.


\DTLloaddb{list}{datad3.csv}


Wo stellt man hier was absolute ein? (Zum ersten Test)
Eine absolute Angabe ist bei mir auch gar nicht möglich, da auch andere (Kollegen) lokal auf ihrem Rechner damit arbeiten und dort der Ort im Verzeichnis immer ein anderer ist. Gibt es hier eine Lösung, das Ganze mit relativen Pfaden zu realisieren?

@elektron - zu deinem letzten Fehler:
Wenn vermutlich ein Feld bei der Abfrage leer ist, dann stehen zwei \\ \\ nacheinander. Meines Wissens ist dies im LaTex nicht zulässig.

elektron
29-10-2010, 22:21
Nabend,

sorry mein Fehler von sowas zu sprechen und nicht als Beispiel dran zu hängen. Da ich zwischen Latex und Lyx immer hin und her springe ist mir das entfallen. Also meine Strategie ist es erst im TeX-works zum laufen zu bekommen und dann per Hand in Lyx zu integrieren. Ich weiß ziemlich umständlich könnte man ja gleich alles im Editor machen. So nun mal noch ne Beispiel für absolute Pfadangabe.
\DTLloadrawdb{list}{Laufwerk:/Verzeichnis/Unterverzeichnis/Datei.cvs}
Und wie hast du das Problem gelöst mit den zweifachen \\? Ich mein das dies der Grund ist ja schön zu wissen, wäre aber auch schön die Lösung zu kennen.
Nachtrag: Die Dateien sollten schon da liegen wo die anderen auch ran kommen. Das Problem besteht ja nur darin, das Lyx das pdf in ne Temp-Verzeichnis zusammensetzt und da eben die csv-Datei nicht vorhanden ist. Und da das Temp-Verzeichnis Nutzer abhängig ist (also an Nutzerkonten geknüpft ist) und ohne Adminrechte nicht ohne weiteres dahin kommt ist die Pfadangabe wichtig wie oben beschrieben. Oder du stellst das Temp-Verzeichnis für Lyx anders ein. Das geht wie folgt Werkzeug->Einstellungen->Pfad da kann man das einstellen. Würde aber sicherlich erste Variante bevorzugen.

Gruß elektron

u_fischer
30-10-2010, 10:01
Ich sagte nicht, dass du die cvs ändern sollst, sondern deinen Code. scrlttr setzt die Adresse mit \raggedright, und das mag keine leere Zeilen:


\documentclass[a4paper]{scrlttr2}

\begin{document}
\raggedright a\\\\b

%\raggedright a\\\mbox{}\\b
\end{document}

Also musst du entweder leere Zeilen verhindern, oder dafür sorgen, dass da was steht, auch wenn es nur eine leere \mbox ist.

msfox
01-11-2010, 07:38
Wie man den Fehler mit den doppelten \\ \\ behebt, wusste ich leider nicht aus dem Kopf, ich kannte hier auch nur die Ursache. Die Lösung hat ja u_fischer gegeben.
Die Möglichkeit mit der absoluten Pfadangabe funktioniert. Allerdings kann dies nicht die Lösung sein. Wie geschrieben, arbeiten bei mir verschiedene Kollegen an dem Dokument, was über Subversion verwaltet wird. Und auch für elektron sollte der absolute Pfad auf Dauer nicht toll sein. Wenn die Datei mal an einen anderen Ort wandert, dann müssen die ganzen Pfade angepasst werden.
Daher meine Idee, den Pfad der aktuellen Lyx-Datei irgendwie auszulesen und den absoluten Pfad dynamisch zu erstellen. Kennt jemand ein Tex-Paket mit dem dies möglich ist?

elektron
09-11-2010, 20:27
Guten Abend,

viele Dank für den Tipp. Habe es jetzt endlich so hin bekommen wie ich es in etwa haben wollte. Aber die ganzen If-Abfragen damit die Adresse richtig gesetzt wird, sind schon ganz schön heftig. Oder gibts dafür nen elegantere Lösung. Ich habe sie mit dem Befehl
\DTLifstringeq*{}{}{}{} realisiert. Jetzt habe ich nur das Problem, dass ich nicht die ganze Adressdatenbank in einen Serienbrief nutzen will, sondern nur einen einzelnen Namen. Wie kann ich auf den einen Namen aus der Datenbank bzw. meiner csv-Datei zugreifen? Es gibt den Befehl
\DTLisopenbetween{}{}{}. Dies ist aber nicht ganz was ich suche da ich den konkreten String eingeben möchte. Gibt es diesen \DTLisopen-Befehl auch ohne between? Oder wie ist die Lösung. Auch mit dem
\DTLifstringeq*{}{}{}{} komme ich da nicht so recht weiter wenn ich ihn als Option
\DTLforeach*[DTLifstringeq*{}{}{}{}]{list}{}.

Vielen Dank für eure Hilfe.

Gruß elektron

elektron
09-11-2010, 20:54
Hallo ich nochmal.
Habe soeben mein Problem gelöst und zwar mit dem Befehl
\DTLforeach*[\DTLisieq{\arg1}{arg2}]{}{}. Wäre mein Englisch besser müsste ich nicht soviel hier posten und würde die Packetbeschreibung besser verstehen. Sorry wenn ich damit genervt habe. Jetzt bin ich erstmal zufrieden und kann schöne Serienbriefe schreiben.

Gruß elektron