Ich habe eine CSV-Datei wie diese:
\begin{filecontents}{data.csv}
type,Description,Value
typA,Description0,Value0
typA,Description1,Value1
typB,Description2,Value2
typA,Description3,Value3
\end{filecontents}
Je nach Spalteninhalt type
möchte ich zwischen mehrspaltig und einspaltig unterscheiden.
In diesem einfachen MWE sollten neben der typB
erwähnten Zeile immer einzelne Spalten vorhanden sein. In diesem Fall sollte nur die Beschreibung in der Mitte der Zeile gedruckt werden, wie im Bild gezeigt.
Ich denke, das ist dem hier ziemlich ähnlichhttps://tex.stackexchange.com/a/459848/104358Frage, aber in meinem Fall möchte ich die spezifischen Zeilen nicht fest codieren. Sie sollten im laufenden Betrieb berechnet werden, indem der Inhalt der Typspalte überprüft wird.
Ich habe versucht, dies mithilfe von zu erreichen, \pgfplotstablegetelem
aber dies scheint in der Umgebung nicht definiert zu sein typeset cell/.code
.
\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\pgfplotsset{compat=newest}
\begin{filecontents}{data.csv}
type,Description,Value
typA,Description0,Value0
typA,Description1,Value1
typB,Description2,Value2
typA,Description3,Value3
\end{filecontents}
\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1}
\pgfplotstableset{
typeset cell/.code={%
%\pgfplotstablegetelem{\pgfplotstablerow}{type}\of{\csvdata}
%\ifthenelse{\equal{\pgfplotsretval}{typB}}{
% Equivalent to: \ifnum\pgfplotstablerow = 2
%}{
% Equivalent to: \ifnum\pgfplotstablerow != 2
%}
\ifnum\pgfplotstablerow=2 %=> This row depends on the content of column type!
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\\}%
\else%
\ifnum\pgfplotstablecol=2%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{3}{c}{#1}}%
\else%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}%
\fi
\fi
\else%
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}%
\fi
\fi
},
}
\begin{document}
\pgfplotstabletypeset[col sep = comma,
string type,
column type = l,
multicolumn names,
]{\csvdata}
\end{document}
Antwort1
Ich habe eine Lösung für mein Problem gefunden! Vielleicht ist es nicht die beste, aber es funktioniert trotzdem!
Der Trick bestand darin, einen Sonderfall dafür zu haben \pgfplotstablerow=-1
, da die Zählung (einschließlich Kopfreihe) \pgfplotstablerow
beginnt , aber (hinter der Kopfreihe) startet .-1
\pgfplotstablegetelem{}{}\of{\csvdata}
0
\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\pgfplotsset{compat=newest}
\begin{filecontents}{data.csv}
Type,Description,Value
typA,descriptionA0,value0
typB,descriptionA1,value1
typA,descriptionB2,value2
\end{filecontents}
\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1}
\newcounter{endRowCounter}
\pgfplotstableset{
col sep=comma,
string type,
typeset cell/.code={%
\setcounter{endRowCounter}{\pgfplotstablerows}
\addtocounter{endRowCounter}{1}
\ifthenelse{\pgfplotstablerow=-1}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}
\fi
}{
\ifthenelse{\pgfplotstablerow<\value{endRowCounter}}{
\pgfplotstablegetelem{\pgfplotstablerow}{Type}\of{\csvdata}
\ifthenelse{\equal{\pgfplotsretval}{typB}}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\\}%
\else
\ifnum\pgfplotstablecol=1
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{3}{c}{#1}}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}%
\fi
\fi
}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}%
\fi
}
}{}
}
},
}
\begin{document}
\pgfplotstabletypeset{\csvdata}
\end{document}
ERGEBNIS