Tabelle aus csv einbinden, mit Kopf, über mehrere Seiten

Tabellen und Grafiken erstellen und anordnen


Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Tabelle aus csv einbinden, mit Kopf, über mehrere Seiten

Beitrag von Crys »

Ich möchte lange Tabellen aus csv-Dateien einbinden.

In den (meisten) Tabellen sind in den ersten beiden Zeilen der Kopf, dass sollte vor \toprule stehen.
In den (meisten) Tabellen ist in der letzten Zeile noch ein Kommentar oder eine Summe, dass sollte unter \bottomrule (oder zweitem \midrule) stehen.

Manche Tabellen sind länger als das diese auf eine A4 Seite passen würde. Deshlab sollten diese Tabellen auf mehrere Teile aufgeteilt werden.
\begin{filecontents}{tableA.csv}
Pos.;Anz.;Länge;Breite 1;Breite 2;Breite 3 (2x);Breite 4 (2x);Dicke;Fläche;Gewicht;Kosten
;;[mm];[mm];[mm];[mm];[mm];[mm];[m$^2$];[kg];[EUR]
1;2;5990;140;;140;25;2;5,63;59,68;259,01
2;4;5990;810;;80;25;1,5;24,44;194,29;843,15
3;2;5990;810;;80;25;1,5;12,22;97,15;421,58
4;2;5990;775;;80;25;1,5;11,80;93,81;407,11
5;1;5990;775;;80;25;1,5;5,90;46,91;203,56
6;2;3600;775;;80;25;1,5;7,09;56,38;244,67
7;1;3600;775;;80;25;1,5;3,55;28,19;122,34
8;1;2325;810;;80;25;1,5;2,37;18,85;81,82
9;1;2325;695;;80;25;1,5;2,10;16,73;72,59
10;2;2430;775;;80;25;1,5;4,79;38,06;165,15
11;1;2340;775;;80;25;1,5;2,30;18,32;79,52
12;1;2175;310;40;;;3;0,76;12,10;52,53
13;1;2175;205;40;;;3;0,53;8,47;36,77
14;1;2335;90;40;;;3;0,30;4,83;20,94
15;1;2335;174;40;;;3;0,50;7,95;34,48
20;4;6000;;;40;;3;1,92;30,53;132,48
21;8;2335;;;40;;3;1,49;23,76;103,11
22;6;2440;;;40;;3;1,17;18,62;80,81
23;4;140;;;140;;3;0,16;2,49;10,82
24;1;2325;1716;;40;;1,5;4,18;33,20;144,06
25;1;2325;1796;;40;;1,5;4,36;34,68;150,48
26;2;2325;1000;40;;;1,5;4,84;38,45;166,84
27;1;2325;610;;80;25;1,5;1,91;15,16;65,77
28;4;1000;;;40;;1,5;0,32;2,54;11,04
29;4;1600;;;40;;1,5;0,51;4,07;17,66
;;;;;;;;105,1;905,2;3928,30
\end{filecontents}

\documentclass{scrartcl}
\usepackage{mwe}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{csvsimple}

\begin{document}

\begin{table}[p!]
	%\caption{Beispieltabelle}
	\csvreader[separator=semicolon, tabular=lllllllllll]{tableA.csv}{}{1 & \csvcolii & \csvcoliii & \csvcoli & \csvcoli & \csvcoli & \csvcoli & \csvcoli & \csvcoli & \csvcoli & \csvcoli}
	%\tiny\csvautotabular[separator=semicolon]{tableA.csv}
\end{table}

\end{document}
(Das VM geht bei mir nicht, ich weiß aber nicht wieso, es kommt kein Fehler.)

Ich möchte einfach immer alle Spalten jeder csv einbinden. Aber per \csvcoli# gehen max. 4 Spalten, bei mehr kommt das es den Befehl nicht gibt.

Wie bekomme ich das oben beschriebene automatisch hin?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Sieh Dir mal das Paket datatool an.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Hier ist mal ein erster Vorschlag mit datatool:
\documentclass{scrartcl} 
\usepackage[utf8]{inputenc}
\usepackage{longtable}
\usepackage{array}
\usepackage{booktabs}
\usepackage{varwidth}
\newcolumntype{h}{>{\begin{varwidth}{5cm}\arraybackslash\centering}c<{\end{varwidth}}}

\usepackage{datatool}
\usepackage[parse-numbers=false]{siunitx}
\DTLsetseparator{;}

\usepackage{pdflscape}

\begin{document}
\begin{landscape}
  \sisetup{
    parse-numbers=false,
    table-number-alignment=right,
    table-figures-integer=4,
    table-figures-decimal=2
  }%
  \DTLloaddb[autokeys,omitlines=5]{mytable}{tableA.csv}
  \edef\spalten{\DTLcolumncount{mytable}}
  \begin{longtable}{*{\spalten}S}
    \multicolumn{1}{h}{Pos.\newline}&
    \multicolumn{1}{h}{Anz.\newline}&
    \multicolumn{1}{h}{Länge\newline[mm]}&
    \multicolumn{1}{h}{Breite 1\newline[mm]}&
    \multicolumn{1}{h}{Breite 2\newline[mm]}&
    \multicolumn{1}{h}{Breite 3 (2x)\newline[mm]}&
    \multicolumn{1}{h}{Breite 4 (2x)\newline[mm]}&
    \multicolumn{1}{h}{Dicke\newline[mm]}&
    \multicolumn{1}{h}{Fläche\newline[m$^2$]}&
    \multicolumn{1}{h}{Gewicht\newline[kg]}&
    \multicolumn{1}{h}{Kosten\newline[EUR]} 
    \DTLforeach*{mytable}{
      \pos=Column1,\anz=Column2,\l=Column3,
      \bi=Column4,\bii=Column5,\biii=Column6,\biv=Column7,
      \d=Column8,\f=Column9,\g=Column10,\k=Column11%
    }{
      \DTLiffirstrow{\\ \midrule}{\\}% 
      \pos&\anz&\l&\bi&\bii&\biii&\biv&\d&\f&\g&\k%
    }
  \end{longtable}%
  \DTLdeletedb{mytable}%
\end{landscape}
\end{document}
Gruß
Elke
Zuletzt geändert von esdd am Sa 22. Nov 2014, 19:41, insgesamt 1-mal geändert.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Vielen Dank Elke!
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{booktabs}
\usepackage{array}
\usepackage{rotating}

\usepackage{varwidth}
\newcolumntype{h}{>{\begin{varwidth}{5cm}\arraybackslash\centering}c<{\end{varwidth}}}

\usepackage{datatool}
\DTLsetseparator{;}

\newcommand{\rcel}[2]{\multicolumn{1}{h}{\rotatebox{90}{#1}\newline $[$#2$]$}}
\newcommand{\rcell}[3]{\multicolumn{1}{h}{\rotatebox{90}{#1} \rotatebox{90}{#2}\newline $[$#3$]$}}

\begin{document}

\DTLloaddb[autokeys,omitlines=5]{CsvTabelle}{tableA.csv}

\begin{table}[hbtp!]
	\footnotesize
	\centering
	
	\begin{tabular}{*{12}{r}}
	\toprule
	
	\rcell{Austritts-}{Geschw.}{m/s} &
	\rcel{Drehzahl}{$\frac{1}{min}$} &
	\rcell{Breite Ver-}{jüngung}{m} &
	\rcell{Verjüngte-}{Fläche}{m$^2$} &
	\rcell{Verjünguns-}{Faktor}{-} &
	\rcell{Druck-}{Verlust}{Pa} &
	\rcell{Leistung}{n. Messung}{W} &
	\rcell{Leistung}{inkl. Steig.}{W}
	
	\DTLforeach*{CsvTabelle}{%
	\SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,\SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8,\SpIX=Column9,\SpX=Column10,\SpXI=Column11%
	}{%
	\DTLiffirstrow{\\\midrule}{\DTLiflastrow{\\\bottomrule}{\\}}%
	\SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII %&\SpIX&\SpX&\SpXI%
	}
	
	\end{tabular}
	\DTLdeletedb{CsvTabelle}
\end{table}

\end{document}
Ich habe mit datatool herum gespielt und gemerkt das es richtig mächtig ist.

Kannst du mir vielleicht auch noch bei der Formatierung weiterhelfen? Ich hab mich von dem "h" Spaltentyp inspirieren lassen ...

Wie kann man den Inhalt der Zelle nach unten ausrichten?

Kann man \rcell und \rcel zusammenfügen, mit optionales Argument für eine neue Zeile (die 90° gedreht ist) oder direkt mit \newline für eine neue Zeile?
Zuletzt geändert von Crys am Fr 21. Nov 2014, 13:58, insgesamt 1-mal geändert.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Bitte erstelle immer lauffähige Minimalbeispiele. Ich musste den Code erst anpassen, um die im Ausgangsbeispiel angegebene Tabelle tableA.csv verwenden zu können.

Den h-Spaltentyp brauchst Du dafür gar nicht.
\documentclass{scrartcl} 
\usepackage[utf8]{inputenc} 
\usepackage{booktabs} 
\usepackage{array} 
\usepackage{rotating} 

\usepackage{varwidth} 
\newcommand{\rcel}[1]{\rotatebox{90}{\begin{varwidth}{5cm}#1\end{varwidth}}} 

\usepackage{datatool} 
\DTLsetseparator{;} 

\begin{document} 

\DTLloaddb[autokeys,omitlines=5]{CsvTabelle}{tableA.csv} 
\edef\spalten{\DTLcolumncount{CsvTabelle}} 

\begin{table}[hbtp!] 
    \footnotesize 
    \centering 
     
    \begin{tabular}{*{12}{r}} 
    \toprule 
    \rcel{Austritts-\\Geschw.}& 
    \rcel{Drehzahl} & 
    \rcel{Breite Ver-\\jüngung} & 
    \rcel{Verjüngte-\\Fläche} & 
    \rcel{Verjünguns-\\Faktor} & 
    \rcel{Druck-\\Verlust} & 
    \rcel{Leistung\\n. Messung} & 
    \rcel{Leistung\\inkl. Steig.} \\
    $[$m/s$]$&$[\frac{1}{\mathrm{min}}]$&$[$m$]$&$[$m$^2$$]$&$[$-$]$&$[$Pa$]$&$[$W$]$&$[$W$]$
    \DTLforeach*{CsvTabelle}{% 
      \SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,%
      \SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8% 
    }{% 
    \DTLiffirstrow{\\ \midrule}{\\}%  
    \SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII %
    } 
    \end{tabular} 
    \DTLdeletedb{CsvTabelle} 
\end{table} 

\end{document}
Gruß
Elke
Zuletzt geändert von esdd am Sa 22. Nov 2014, 19:41, insgesamt 1-mal geändert.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Vielen Dank Elke!
esdd hat geschrieben:Bitte erstelle immer lauffähige Minimalbeispiele. Ich musste den Code erst anpassen, um die im Ausgangsbeispiel angegebene Tabelle tableA.csv verwenden zu können.
Sorry, bei mir funktioniert das Beispiel aber, wie gepostet.

Was für Anpassungen waren nötig?
Bei mir genügt 'omitlines=1', da die erste Zeile nie dargestellt wird und ich mit '1' genau bei der ersten Datenzeile lande. Erzeugt nach dem 'filecontents' aus meinem Start-Post.
Mit 'omitlines=5' lande ich so erst bei der 5ten Datenzeile.
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{booktabs}
\usepackage{array}
\usepackage{rotating}

\usepackage{varwidth}
\newcommand{\rcell}[1]{\multicolumn{1}{c}{\rotatebox{90}{\begin{varwidth}{5cm}#1\end{varwidth}}}}
\newcommand{\mcell}[1]{\multicolumn{1}{c}{$[$#1$]$}}

\usepackage{datatool}
\DTLsetseparator{;}

\begin{document}

\begin{table}[hbtp!]
	\footnotesize
	\centering
		
	\DTLloaddb[autokeys,omitlines=5]{CsvTabelle}{tableA.csv}
	\edef\spalten{\DTLcolumncount{CsvTabelle}}

	\begin{tabular}{*{\spalten}{r}}
		\toprule
		
		\rcell{Austritts-\\Geschw.}&
		\rcell{Drehzahl} &
		\rcell{Breite Ver-\\jüngung} &
		\rcell{Verjüngte-\\Fläche} &
		\rcell{Verjünguns-\\Faktor} &
		\rcell{Druck-\\Verlust} &
		\rcell{Leistung\\n. Messung} &
		\rcell{Leistung\\inkl. Steig.}\\

		\mcell{m/s} & 
		\mcell{$\frac{1}{min}$} & 
		\mcell{m} & 
		\mcell{m$^2$} & 
		\mcell{-} & 
		\mcell{Pa} & 
		\mcell{W} & 
		\mcell{W}
		
		\DTLforeach*{CsvTabelle}{%
		\SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,\SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8,\SpIX=Column9,\SpX=Column10,\SpXI=Column11%,\SpXII=Column12,\SpXIII=Column13,\SpXIV=Column14,\SpXV=Column15%
		}{%
		\DTLiffirstrow{\\\midrule}{\DTLiflastrow{\\\bottomrule}{\\}}%
		\SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII%&\SpIX&\SpX&\SpXI%
		}
		\DTLdeletedb{CsvTabelle}
	\end{tabular}
\end{table}

\end{document}
Ich habe das mal so umgesetzt, da ich die Kopfzeile noch zentriert haben möchte.
Du hast mir aber sehr weiter geholfen.

Eine Frage hätte ich noch. Ich muss manchmal eine bestimmt Zeile makieren, bzw. setzte ich eine \midline zur Übersicht darunter. Z.B. wenn die erste Spalte 6 ist.
Ich habe mit '\DTLiseq' herumprobiert, weiß aber nicht ob ich auf dem Holzweg bin? Wie könnte ich das umsetzten?
Zuletzt geändert von Crys am Do 20. Nov 2014, 12:42, insgesamt 3-mal geändert.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Dein Beispiel kann bei Dir durchaus gelaufen sein. Denn Du hast sicher eine Tabelle die tabeleA.csv heißt und bei der nur die erste Zeile nicht dargestellt werden muss. Ich habe die aber nicht! Im Ausgangsbeispiel hast Du eine Tabelle tableA.csv erzeugt, die am Anfang mehrere Kommentarzeilen enthält.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Sorry, aber im obersten Beispiel sind genau 2 Kommentar Zeilen.
Kommt die Verwirrung, weil ich im obersten Post table.csv geschrieben habe und im letzten Beispiel tabeleA.csv? Der Schreibfehler ist mir gar nicht aufgefallen und habe ich auch gerade erst gemerkt ... die Tabellen sind aber identisch.
\edit: ich habe alle Codes in diesem Thread getestet und ggf. so geändert, das es mit der obersten csv auf jeden Fall geht.
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{booktabs}
\usepackage{array}
\usepackage{rotating}

\usepackage{varwidth}
\newcommand{\rcell}[1]{\multicolumn{1}{c}{\rotatebox{90}{\begin{varwidth}{5cm}#1\end{varwidth}}}}
\newcommand{\mcell}[1]{\multicolumn{1}{c}{$[$#1$]$}}

\usepackage{datatool}
\DTLsetseparator{;}
\usepackage{colortbl}

\begin{document}

\begin{table}[hbtp!]
	\footnotesize
	\centering
		
	\DTLloaddb[autokeys,omitlines=5]{CsvTabelle}{tableA.csv}

	\begin{tabular}{*{88}{r}}
		\toprule
		
		\rcell{Austritts-\\Geschw.}&
		\rcell{Drehzahl} &
		\rcell{Breite Ver-\\jüngung} &
		\rcell{Verjüngte-\\Fläche} &
		\rcell{Verjünguns-\\Faktor} &
		\rcell{Druck-\\Verlust} &
		\rcell{Leistung\\n. Messung} &
		\rcell{Leistung\\inkl. Steig.}\\

		\mcell{m/s} & 
		\mcell{$\frac{1}{min}$} & 
		\mcell{m} & 
		\mcell{m$^2$} & 
		\mcell{-} & 
		\mcell{Pa} & 
		\mcell{W} & 
		\mcell{W}
		
		\DTLforeach*[\value{DTLrowi}<10]{CsvTabelle}{%
		\SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,\SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8,\SpIX=Column9,\SpX=Column10,\SpXI=Column11%,\SpXII=Column12,\SpXIII=Column13,\SpXIV=Column14,\SpXV=Column15%
		}{%
		\DTLiffirstrow{\\\midrule}{\DTLiflastrow{\\}{\\}}%
		\ifthenelse{\DTLiseq{\SpI}{3}\or\DTLiseq{\SpI}{5}}{%
		\\\midrule
		%\rowcolor{green}
		\SpI&mark&iert&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII%&\SpIX&\SpX&\SpXI%
		}{%
		\SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII%&\SpIX&\SpX&\SpXI%
		}}%
		\DTLdeletedb{CsvTabelle}
		\\\bottomrule
	\end{tabular}
\end{table}

\end{document}
Ich habe versucht eine Zeile zu makieren, aber es gibt immer einen Fehler "Missplayced \noalign" aus, wenn ich kein \\ voranstelle. Wenn ich das mache, gibt das aber eine unschöne Leerzeile. Wie mache ich das richtig?

Kann man das markieren in Zeile 3 und 5 irgendwie besser kombinieren?
Zuletzt geändert von Crys am Fr 21. Nov 2014, 14:00, insgesamt 3-mal geändert.

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Ich habe noch ein bisschen weiter getestet:
		% ...
		\DTLforeach*[\value{DTLrowi}<10]{CsvTabelle}{%
		\SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,\SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8%
		}{%
		%\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		\ifthenelse{\DTLiseq{\SpI}{3}\or\DTLiseq{\SpI}{5}}{%
		\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		%\rowcolor{yellow}%
		%\midrule%
		\hline%
		}{%
		\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		}%
		\SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII%
		}%
		\DTLdeletedb{CsvTabelle}
		% ...
Das geht, so wie ich das möchte!
		% ...
		\DTLforeach*[\value{DTLrowi}<10]{CsvTabelle}{%
		\SpI=Column1,\SpII=Column2,\SpIII=Column3,\SpIV=Column4,\SpV=Column5,\SpVI=Column6,\SpVII=Column7,\SpVIII=Column8%
		}{%
		\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		\ifthenelse{\DTLiseq{\SpI}{3}\or\DTLiseq{\SpI}{5}}{%
		%\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		%\rowcolor{yellow}%
		%\midrule%
		\hline%
		}{%
		%\DTLiffirstrow{\\\midrule}{\DTLiflastrow{}{\\}}%
		}%
		\SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII%
		}%
		\DTLdeletedb{CsvTabelle}
		% ...
Das geht nicht. Ich habe nur die "\DTLiffirstrow{.." Zeile vorgeschoben. Logisch steht diese an der selben Position und zwischen der Zeilen und der nachfolgenden Markierung ("\hline") steht auch kein Zeichen. Aber es funktioniert dennoch nicht. Wieso?

Crys
Forum-Century
Forum-Century
Beiträge: 202
Registriert: So 16. Okt 2011, 20:34
Wohnort: localhost:1337

Beitrag von Crys »

Ich habe noch ein kleines Problem. Ich möchte eine Spalte einlesen und diese ausgeben. Die Spalten links und rechts davon möchte ich aber manuell in der tex-Datei eingeben.
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{booktabs}

\usepackage{datatool}
\DTLsetseparator{;}

\begin{document}

\begin{table}[hbtp!]
	\footnotesize
	\centering
		
	\begin{tabular}{lcl}
		\toprule
		
		\DTLloaddb[autokeys,omitlines=5]{CsvTabelleZwei}{tableA.csv}
		\DTLforeach*[\value{DTLrowi}<5]{CsvTabelleZwei}{%
		\SpIV=Column4%
		}{%
		&\SpIV&\\
		}%
		Zeile Eins & $\langle$\textit{\textbackslash SpII}$\rangle$ & $[$m$]$\\
		Zeile Zwei & $\langle$\textit{\textbackslash SpII}$\rangle$ & $[$m$^2]$\\
		Zeile Drei & $\langle$\textit{\textbackslash SpII}$\rangle$ & $[$m$^3]$\\
		Zeile Vier & $\langle$\textit{\textbackslash SpII}$\rangle$ & $[$m$^{-1}]$\\
		Zeile Fünf & $\langle$\textit{\textbackslash SpII}$\rangle$ & $[$Nm$]$%
		%
		\DTLdeletedb{CsvTabelleZwei}
		\\\bottomrule
	\end{tabular}
\end{table}

\end{document}
Wie mache ich das am besten?

Antworten