Nehmen wir an, ich habe eine große Menge einfach strukturierter Datenzeilen, .csv
und 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 Description
Felds 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
ERWARTETES ERGEBNIS
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
Aber wie kann ich
- Eine Mehrfachspalte, beginnend bei der ersten Spalte
- Unterdrücken der zweiten Zeile mit den Y-Pos-Informationen
- Ersetzen Sie es
Content Description
durch den tatsächlichen Inhalt der Beschreibung, in diesem FallPowerSupply
?
Antwort1
Könnte eine Lösung mit Ihnen vereinbar sein csvsimple-l3
und tabularray
fü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}
csvsimple-l3
Sie können auch ein normales verwenden tabular
, aber mit einem Trick, einer fünften Dummy-Spalte, um Probleme mit dem siunitx
Spaltentyp 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}
NB = Das Makro \IfCsvsimStrEqualTF
ist recht neu. Wenn Ihre Distribution nicht auf dem neuesten Stand ist, verwenden Sie \ifcsvstrcmp
stattdessen. 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