Unterscheiden Sie zwischen mehrspaltigen und einspaltigen Spalten anhand des Zellinhalts in pgfplotstable

Unterscheiden Sie zwischen mehrspaltigen und einspaltigen Spalten anhand des Zellinhalts in pgfplotstable

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 typemöchte ich zwischen mehrspaltig und einspaltig unterscheiden.

In diesem einfachen MWE sollten neben der typBerwä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, \pgfplotstablegetelemaber 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}

Bildbeschreibung hier eingeben

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) \pgfplotstablerowbeginnt , 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

Bildbeschreibung hier eingeben

verwandte Informationen