pgfplotstable: Änderung in mehrspaltige Zeilen abhängig von den Eingabedaten

pgfplotstable: Änderung in mehrspaltige Zeilen abhängig von den Eingabedaten

Nehmen wir an, ich habe eine große Menge einfach strukturierter Datenzeilen, .csvund diese Datenzeilen könnten in verschiedene Datentypen unterteilt werden.

Im MWE habe ich einfach zwei Typen ( typA& typB) hinzugefügt.

Falls die Zeile enthält typA, sollte die Tabelle so ausgedruckt und in meinem Ergebnis angezeigt werden.

Falls die Zeile enthält typB, sollte diese Zeile eine mehrspaltige Zeile sein, in der nur der Inhalt des DescriptionFelds in der Mitte gedruckt wird.

Wie kann ich dies mit LaTeX erreichen? :)

MWE

\documentclass{article}
\usepackage[a4paper, margin=10mm]{geometry}
\usepackage{pgfplotstable}
\usepackage{mwe}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.csv}
Type, Description, X-Pos, Y-Pos
typA, PowerSupply, 3590,  2000
typA, PowerSupply, 3590,  2500
typB, PowerSupply, 4250,  6070
typA, singleSwitch,5700,  6070
\end{filecontents}

\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1} 

\begin{document}
\begin{center}
\pgfplotstabletypeset[%
font=\ttfamily,%
col sep=comma,%
columns={Type,Description,X-Pos,Y-Pos},%
columns/Type/.style={%
column name=Type,%
string type%
},%
columns/Description/.style={%
column name=Description,%
string type%
},%
columns/X-Pos/.style={%
column name=X-Pos%
},%
columns/Y-Pos/.style={%
column name=Y-Pos,%
column type/.add={}{|}%
},%
column type/.add={|}{},%
after row={\hline},%
every head row/.style={before row=\hline},
]{\csvdata}%
\end{center}
\end{document}

ERGEBNIS

Bildbeschreibung hier eingeben

ERWARTETES ERGEBNIS

Bildbeschreibung hier eingeben

BEARBEITEN

Meine Idee ist, so etwas hinzuzufügen:

every column/.style={%
    assign cell content/.code={%
        \pgfplotstablegetelem{\pgfplotstablerow}{Type}\of{\csvdata}
        \ifthenelse{\equal{\pgfplotsretval}{typB}}{%
            \ifthenelse{\equal{\pgfplotstablecol}{2}}{%=> Just do this once!
                \pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{2}{c|}{Content Description}\\\hline}
            }{}
        }{}
    },
},

Zweites MWE

\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.csv}
Type, Description, X-Pos, Y-Pos
typA, PowerSupply, 3590,  2000
typA, PowerSupply, 3590,  2500
typB, PowerSupply, 4250,  6070
typA, singleSwitch,5700,  6070
\end{filecontents}

\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1} 

\begin{document}
\pgfplotstabletypeset[%
font=\ttfamily,%
col sep=comma,%
columns={Type,Description,X-Pos,Y-Pos},%
columns/Type/.style={%
column name=Type,%
string type%
},%
every column/.style={%
    assign cell content/.code={%
        \pgfplotstablegetelem{\pgfplotstablerow}{Type}\of{\csvdata}
        \ifthenelse{\equal{\pgfplotsretval}{typB}}{%
            \ifthenelse{\equal{\pgfplotstablecol}{2}}{%=> Just do this once!
                \pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{2}{c|}{Content Description}\\\hline}
            }{}
        }{}
    },
},
columns/Description/.style={%
    column name=Description,%
    string type%
},%
columns/X-Pos/.style={%
    column name=X-Pos%
},%
columns/Y-Pos/.style={%
    column name=Y-Pos,%
    column type/.add={}{|}%
},%
column type/.add={|}{},%
after row={\hline},%
every head row/.style={before row=\hline},
]{\csvdata}%
\end{document}

ERGEBNIS

Bildbeschreibung hier eingeben

Aber wie kann ich

  1. Eine Mehrfachspalte, beginnend bei der ersten Spalte
  2. Unterdrücken der zweiten Zeile mit den Y-Pos-Informationen
  3. Ersetzen Sie es Content Descriptiondurch den tatsächlichen Inhalt der Beschreibung, in diesem Fall PowerSupply?

Antwort1

Könnte eine Lösung mit Ihnen vereinbar sein csvsimple-l3und tabularrayfür Sie akzeptabel sein?

\documentclass{article}
\usepackage[a4paper, margin=10mm]{geometry}

\usepackage{csvsimple-l3}

\usepackage{tabularray}
\UseTblrLibrary{siunitx}
\sisetup{
  group-digits=integer,
  group-minimum-digits={3},
  group-separator={,}
  }

\begin{filecontents*}{data.csv}
Type, Description, X-Pos, Y-Pos
typA, PowerSupply, 3590,  2000
typA, PowerSupply, 3590,  2500
typB, PowerSupply, 4250,  6070
typA, singleSwitch,5700,  6070
\end{filecontents*}

\begin{document}
\csvreader[no head,
centered tabularray =
{
colspec={cc*2{S[table-format=4]}}, 
columns={font=\ttfamily},
hlines,
vlines,
},
]{data.csv}{}{%
\ifcsvfirstrow{% header
  \csvcoli & \csvcolii
  & {{{\csvcoliii}}}
  & {{{\csvcoliv}}}
    }{% rows
  \IfCsvsimStrEqualTF{\csvcoli}{typB}{% multicolumn
    \SetCell[c=4]{c}\csvcolii&&&}{% other rows
    \csvcoli & \csvcolii
    & \csvcoliii
    & \csvcoliv}
        }
    }
\end{document}

Bildbeschreibung hier eingeben

csvsimple-l3Sie können auch ein normales verwenden tabular, aber mit einem Trick, einer fünften Dummy-Spalte, um Probleme mit dem siunitxSpaltentyp in der letzten Spalte zu vermeiden:

\documentclass{article}
\usepackage[a4paper, margin=10mm]{geometry}

\usepackage{csvsimple-l3}
\usepackage{array}
\renewcommand{\arraystretch}{1.3}
\usepackage{siunitx}
\sisetup{
  group-digits=integer,
  group-minimum-digits={3},
  group-separator={,},
    table-number-alignment=center
  }

\begin{filecontents*}{data.csv}
Type, Description, X-Pos, Y-Pos
typA, PowerSupply, 3590,  2000
typA, PowerSupply, 3590,  2500
typB, PowerSupply, 4250,  6070
typA, singleSwitch,5700,  6070
\end{filecontents*}

\begin{document}
\csvreader[
  head to column names,
  before reading = {\begin{center}\ttfamily},
  tabular = {|c|c|S[table-format=4]|S[table-format=4]@{}c|},% the last dummy column is necessary
    % due to csvreader-l3 problems, see documentation, Section 7.4 Tables with Number Formatting
  table head = {\hline Type & Description & {X-Pos} & {Y-Pos}&\\\hline},
  late after line = \\\hline,
  after reading = \end{center}
  ]{data.csv}{}{%
  \IfCsvsimStrEqualTF{\csvcoli}{typB}{% multicolumn
    \multicolumn{5}{|c|}{\csvcolii}
        }{% other rows
    \csvcoli & \csvcolii
    & \csvcoliii
    & \csvcoliv &
        }
  }
\end{document}

Bildbeschreibung hier eingeben

NB = Das Makro \IfCsvsimStrEqualTFist recht neu. Wenn Ihre Distribution nicht auf dem neuesten Stand ist, verwenden Sie \ifcsvstrcmpstattdessen. In beiden obigen Beispielen ändert sich das Ergebnis mit dem alten Makro nicht.

Antwort2

Hier ist eine Lösung für OpTeX-Benutzer:

\createfile {data.csv}
Type, Description, X-Pos, Y-Pos
typA, PowerSupply, 3590,  2000
typA, PowerSupply, 3590,  2500
typB, PowerSupply, 4250,  6070
typA, singleSwitch,5700,  6070
\endfile

\def\p #1,#2,#3,#4#5 {%
   \ifx^#1^\else
      \isequal{typB}{#1}
      \iftrue
         \mspan4[|c|]{#2} \crl
      \else
         #1 & #2 & #3 & #4#5 \crl
      \fi
      \ea\p
   \fi
}

{\everyeof{,,,{} }
\table{|c|c|c|c|}{\crl
   \ea\p\input data.csv
}}

\bye

verwandte Informationen