Tabellen aus .csv Dateien mit LaTeX und pgfplotstable

Verwende das Paket pgfplotstable um .csv Dateien einzulesen und diese automatisch als Tabelle zu deinem Dokument hinzuzufügen.


[Dokument online öffnen]

Beim Schreiben von wissenschaftlichen Arbeiten müssen sehr häufig große Datenmengen in Tabellen präsentiert werden. Solche Tabellen händisch in LaTeX einzugeben ist zeitaufwändig und fehleranfällig. Um dies zu vermeiden, können wir die Daten direkt aus einer .csv (comma-separated value) Datei einlesen. Programme wie Excel, OpenOffice Calc oder sogar der Emacs org-mode können Tabellen im .csv Format exportieren. LaTeX kann mit diesen Tabellen nicht nativ umgehen, aber mit dem folgenden Code, können Tabellen aus .csv Dateien generiert werden:

\documentclass{article}

\usepackage{booktabs} % For \toprule, \midrule and \bottomrule
\usepackage{siunitx} % Formats the units and values
\usepackage{pgfplotstable} % Generates table from .csv

% Setup siunitx:
\sisetup{
  round-mode          = places, % Rounds numbers
  round-precision     = 2, % to 2 places
}

\begin{document}

\begin{table}[h!]
  \begin{center}
    \caption{Autogenerated table from .csv file.}
    \label{table1}
    \pgfplotstabletypeset[
      multicolumn names, % allows to have multicolumn names
      col sep=comma, % the seperator in our .csv file
      display columns/0/.style={
		column name=$Value 1$, % name of first column
		column type={S},string type},  % use siunitx for formatting
      display columns/1/.style={
		column name=$Value 2$,
		column type={S},string type},
      every head row/.style={
		before row={\toprule}, % have a rule at top
		after row={
			\si{\ampere} & \si{\volt}\\ % the units seperated by &
			\midrule} % rule under units
			},
		every last row/.style={after row=\bottomrule}, % rule at bottom
    ]{table.csv} % filename/path to file
  \end{center}
\end{table}

\end{document}

Dies wird den folgenden Output generieren:

Bildschirmfoto 2015-11-18 um 13.00.43.png

Dies ist sehr viel Code, nur um eine Tabelle zu erzeugen. Aber keine sorge. Wir können den Code jedes mal wiederverwenden, es ist nicht notwendig diesen jedes mal von neuem zu schreiben. Der einzige Teil der angepasst werden muss, ist der folgende:

...
 display columns/0/.style={
		column name=$Value 1$,
		column type={S},string type},
      display columns/1/.style={
		column name=$Value 2$,
		column type={S},string type},
      every head row/.style={
		before row={\toprule},
		after row={
			\si{\ampere} & \si{\volt}\\
			\midrule}
			},
		every last row/.style={after row=\bottomrule},
    ]{table.csv} % filename/path to file
...

Hinzufügen neuer Spalten

Der Teil, welcher die Spaltennamen und Formatierung kontrolliert, ist:

...
      display columns/1/.style={
		column name=$Value 2$,
		column type={S},string type},
...

Der Teil display columns/NUM/ lässt uns einen Namen für eine Spalte wählen. Beachte, dass die Nummerierung bei 0 anfängt. Um eine neue Zeile hinzuzufügen, kopiere zum Beispiel einmal den Abschnitt und ändere die Nummer entsprechend:

...
      display columns/2/.style={
		column name=$Value 3$,
		column type={S},string type},
...

Das ist auch schon alles was wir tun müssen, zumindest beinahe, denn wir sollten noch eine Einheit für unsere Spalte definieren, was wie folgt geschieht:

...
		after row={
			\si{\ampere} & \si{\volt}\\
			\midrule}
			},
...

Wir platzieren einfach ein neues Und-Zeichen & in die entsprechende Spalte und definieren eine Einheit, wie z.B.:

...
		after row={
			\si{\ampere} & \si{\volt} & \si{\tesla}\\
			\midrule}
			},
...

Damit die automatische Tabellenerstellung funktioniert, müssen wir sicher stellen, dass die .csv Datei im korrekten Format exportiert wurde. Es müssen Kommata als Spaltentrennzeichen und Newline-Zeichen als Zeilentrennzeichen verwendet werden. Wir könnten alternativ auch andere Separatoren definieren, aber ich empfehle die oben genannten Separatoren zu verwenden um Probleme zu vermieden. Die rohe .csv Datei für das obige Beispiel sieht so aus:

Die Struktur einer .csv Datei

column 1,column 2
1,2
11.432,2342.23123123

Wie du sehen kannst, sind die Nummern innerhalb dieser Datei länger als das, was im PDF angezeigt wird. Dies ist so, weil wir SI-Units am Dokumentenanfang entsprechend konfiguriert haben:

\sisetup{
  round-mode          = places, % Rounds numbers
  round-precision     = 2, % to 2 places
}

Durch diese zentrale Einstellung lässt sich eine einheitliche Formatierung im gesamten Dokument (einschließlich der Tabellen) herstellen. Es ist sehr einfach eine weitere Tabelle hinzuzufügen, dazu muss einfach der hier besprochene Code kopiert und die Einträge entsprechend geändert werden.

Zusammenfassung

  • LaTeX kann automatisch Tabellen aus .csv Dateien generieren
  • Kopiere einfach den obigen Code und die erwähnten Pakete um reibungslos diese Funktion zu verwenden
  • Um neue Spalten hinzuzufügen, musst du einfach die display column Spalte kopieren und anschließend die Nummer und den Namen anpassen
  • Um neue Einheiten hinzuzufügen, kannst du den Befehl \siunitx und das Und-Zeichen & verwenden, so wie oben beschrieben
  • Die .csv Datei muss Kommata als Spalten- und Newline-Zeichen als Zeilentrennzeichen verwenden, damit der Beispielcode funktioniert
  • Der Code funktioniert lediglich für Tabellen, welche kleiner als eine Seite sind

Nächste Lektion: Lektion 10