PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zahlen als Fließkommazahlen aus .txt Datei einlesen



J0Sch
11-02-2013, 16:55
Hallo,

ich habe folgendes Problem:
Ich will Zahlen aus einer .txt Datei einlesen und mit dem FP-Packet Verrechnen.
Die Ergebnisse werden anschließend teil eines Sankay-Diagramms (mit Tikts).
Eigentlich bin ich auch erfolgreich, d.h. Latex Rechnet richtig und das Sankay-Diagramm sieht auch ordentlich aus... allerding produziere ich Fehlermeldungen.
Ich vermute, dass ich die Zahlen als String einlese und nicht als Fließkommazahl. Das FP-Paket kann mit den Daten dann zwar umgehen "beschwert" sich aber.
Das Problem nochmal als Minimalbeispiel

\begin{filecontents}{daten.txt}
3
4
\end{filecontents}

\documentclass[a4paper,12pt]{scrreprt}

\usepackage[utf8]inputenc}
\usepackage[ngerman]babel}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{array}
\usepackage[T1]{fontenc}
\usepackage{fp}

%Einlesen von externen Daten:
\openin 1 = daten.txt
\read 1 to \sinnlosA
\read 1 to \sinnlosB
\read 1 to \sinnlosC
\read 1 to \sinnlosD
\read 1 to \ZahlA
\read 1 to \ZahlB
\closein 1

\begin{document}

% Berechnung
\FPdiv{\Erg}{\ZahlA}{\ZahlB}
\FPround{\Erg}{\Erg}{2}

Rechnung ist richtig $\frac{3}{4}=$ \FPprint{\Erg}\\

\end{document}

Für Tipps wie ich die Fehlermeldungen umgehen, oder die Zahlen direkt als Fließkommazahlen einlesen kan bin ich überaus dankbar ;)

Viele Grüße,
Josch

klops
11-02-2013, 17:26
Du hast IMHO mehrere Probleme. Zum einen reißt Du Dir einfach mal so eben input file handle 1 unter den Nagel. Stattdessen solltest Du ein neues handle mit \newread anfordern und dann dieses verwenden, beispielsweise:

\newread\fpdatafile
\immediate\openin\fpdatafile daten.txt
\immediate\read\fpdatafile to \sinnlosA

\immediate\closein\fpdatafile
Das andere potentielles Problem ist hier bereits angerissen, indem ich \immediate verwende. Bei asynchronen Eingaben ist es eher schwer herauszufinden, wann die denn genau getätigt werden. Deshalb ist es eventuell besser, mit \immediate synchron zu arbeiten.

Ein weiteres Problem kann ggf. sein, dass Du Daten einliest, ohne vorher zu prüfen, ob überhaupt noch Daten vorhanden sind. Im Beispiel passt das zufällig.

Dann fehlen in Deinem Beispiel bei inputenc und babel die {-Klammern.

Beim Einlesen werden außerdem die Zeilenenden so mit gelesen und sind dann als Leerzeichen Teil des Makros. Du bekommst also \FPdiv{\Erg}{3 }{4 } und das ist nun einmal nicht korrekt. Man kann das korrigieren, indem man die catcodes der entsprechenden Zeichen auf ignore (=9) setzt:
\begin{filecontents*}{daten.txt}
3
4
\end{filecontents*}

\documentclass[a4paper,12pt]{scrreprt}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{array}
\usepackage[T1]{fontenc}
\usepackage{fp}

%Einlesen von externen Daten:
\newread\fpdatafile
{% Änderungen lokal zu dieser Gruppe halten
\catcode`\^^J9
\catcode`\^^M9
\immediate\openin\fpdatafile daten.txt
% Definition von \ZahlA und \ZahlB daher nun global vornehmen
\immediate\global\read\fpdatafile to \ZahlA
\immediate\global\read\fpdatafile to \ZahlB
\immediate\closein\fpdatafile
}

\begin{document}

% Berechnung
\FPdiv{\Erg}{\ZahlA}{\ZahlB}
\FPround{\Erg}{\Erg}{2}

Rechnung ist richtig $\frac{3}{4}=$ \FPprint{\Erg}\\

\end{document}

bobmalaria
11-02-2013, 17:56
hi,

wir hatten das vor einigen tagen so aehnlich. mit pgfplotstable geht es ganz angenehm.


\documentclass{scrartcl}
\usepackage[utf8]{inputenc}

\usepackage[T1]{fontenc}
\usepackage{filecontents}

\begin{filecontents}{parameter.dat}
3
4
\end{filecontents}

%datansatz einlesen
\usepackage{pgfplotstable}
%krasse gleitkommazahlen
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}

\begin{document}
%tabelle einlesen aus datei
\pgfplotstableread{parameter.dat}\parameters

%element aus spalte eins, reihe eins abrufen = 3
\pgfplotstablegetelem{0}{0}\of\parameters
%ergebnis an \paramA uebergeben
\let\paramA\pgfplotsretval
%das gleich nochmal fuer element in spalte eins, reihe2 =4
\pgfplotstablegetelem{1}{0}\of\parameters
\let\paramB\pgfplotsretval

%rechnen
\pgfmathparse{\paramA / \paramB}
%ergebnis uebertragen an \ergebnis
\let\ergebnis\pgfmathresult

%ausgabe
$\frac{3}{4}= \ergebnis$

\end{document}


gruss

J0Sch
12-02-2013, 08:41
moin moin,

vielen Dank für die schnelle Problemlösung!
Die fehlenden { sind wohl dem Löschen von Leerzeichen (Kommentare nach \usepackage) zum Opfer gefallen... :o

@ klops: ich habe das Einlesen der Daten ohne weitere Kenntnisse einfach aus einem Beispiel übernommen.
Gibt es eine Dokumentation in der ich weitere Infos zu den Befehlen (z.B. \immediate\openin\fpdatafile daten.txt) bekommen kann?

Ich werde eure Lösung einarbeiten und mich ggf. nachmal melden falls Probleme auftreten. Im Moment gefällt mir das Rechen mit dem fp-Paket ganz gut.
Gibt es irgendwelche Nachteile gegenüber der Lösung mit pgfplotstable?

Viele Grüße,
Josch

klops
12-02-2013, 14:53
\openin, \read, \closein, \catcode sind ebenso wie die Präfixe \immediate und \global Low-Level TeX-Befehle¹ und daher in "The TeXbook" oder "TeX by Topic" zu finden. Letzteres ist kostenlos und legal als PDF im Netz zu finden. \newread ist ein Low-Level-LaTeX-Befehl und deshalb in source2e.pdf (sollte mit jeder LaTeX-Distribution installiert werden und ist im Zweifelsfall auf CTAN verfügbar) zu finden. Da AFAIR plainTeX diese Anweisung ebenfalls hat, dürfte sie auch in den beiden genannten Büchern zu finden sein.

-----
1 Genau genommen handelt es sich dabei sogar um TeX-Primitive.