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

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Tabelle aus csv einbinden, mit Kopf, über mehrere Seiten

von esdd » Sa 22. Nov 2014, 19:52

Crys hat geschrieben:Danke. Problem ist, dass die erste Zeile nicht markiert werden kann.
Aber anders geht es eben so kurz nicht ... wieso auch immer. Habe noch lange versucht den Fehler zu finden, aber ist einfach so ...
\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{;}

\usepackage[table]{xcolor}

\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 \rowcolor{green}}{\\}%   
     \SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII % 
     } 
     \end{tabular} 
     \DTLdeletedb{CsvTabelle} 
\end{table} 

\end{document}
Crys hat geschrieben:Ein Tipp zu den anderen Problem, mit nur einer Spalte, zwischen normalen Text?


Am einfachsten ist es, Du ergänzt die benötigten Spalten direkt in der tableA.csv.

Gruß
Elke

von Crys » Sa 22. Nov 2014, 17:21

Danke. Problem ist, dass die erste Zeile nicht markiert werden kann.
Aber anders geht es eben so kurz nicht ... wieso auch immer. Habe noch lange versucht den Fehler zu finden, aber ist einfach so ...

Ein Tipp zu den anderen Problem, mit nur einer Spalte, zwischen normalen Text?

von esdd » Fr 21. Nov 2014, 17:26

Ansätze für Dein oberes Problem, wenn xcolor mit der table Option geladen ist:
 ...
       \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%
       }{% 
       \DTLiffirstrow{\\\midrule}{%
        \ifthenelse{\DTLiseq{\SpI}{3}\or\DTLiseq{\SpI}{6}}{\\\midrule}{%
          \ifthenelse{\DTLiseq{\SpI}{5}}{\\\rowcolor{green}}{\\}}}% 
       \SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII% 
       }% 
       \DTLdeletedb{CsvTabelle} 
oder

 ...
      \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}{%
       \ifthenelse{\equal{\theDTLrowi}{3}}{\\\rowcolor{red}}{\\}}% %
       \SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII% 
       \ifthenelse{\equal{\theDTLrowi}{3}}{\dtlbreak}{}%
       }% 
        \DTLforeach*[\DTLisgt{\SpI}{3}]{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}{% 
       \ifthenelse{\equal{\SpI}{5}}{\\\rowcolor{red}}{\\}}%
       \SpI&\SpII&\SpIII&\SpIV&\SpV&\SpVI&\SpVII&\SpVIII% 
       \ifthenelse{\equal{\SpI}{5}}{\dtlbreak}{}%
       }% 
       \DTLdeletedb{CsvTabelle}
...

von Crys » Fr 21. Nov 2014, 13:57

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?

von Crys » Fr 21. Nov 2014, 11:36

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?

von Crys » Do 20. Nov 2014, 23:23

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?

von esdd » Do 20. Nov 2014, 12:33

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.

von Crys » Do 20. Nov 2014, 12:00

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?

von esdd » Do 20. Nov 2014, 09:40

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

von Crys » Do 20. Nov 2014, 00:09

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?

Nach oben