Seite 1 von 2

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

Verfasst: Mo 29. Sep 2014, 16:28
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?

Verfasst: Di 30. Sep 2014, 19:21
von esdd
Sieh Dir mal das Paket datatool an.

Verfasst: Mi 1. Okt 2014, 15:37
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

Verfasst: Do 20. Nov 2014, 00:09
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?

Verfasst: Do 20. Nov 2014, 09:40
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

Verfasst: Do 20. Nov 2014, 12:00
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?

Verfasst: Do 20. Nov 2014, 12:33
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.

Verfasst: Do 20. Nov 2014, 23:23
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?

Verfasst: Fr 21. Nov 2014, 11:36
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?

Verfasst: Fr 21. Nov 2014, 13:57
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?