単純な構造を持つ膨大なデータ行があり.csv
、これらのデータ行をさまざまなデータ型に分割できるとします。
MWE では、2 つのタイプ ( typA
& typB
) を追加しました。
行に が含まれている場合typA
、テーブルはそのまま印刷され、結果に表示されます。
行に が含まれる場合typB
、この行はフィールドの内容のみがDescription
中央に印刷される複数列の行になります。
これを LaTeX で実現するにはどうすればいいでしょうか? :)
ムウェ
\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}
結果
期待される結果
編集
私のアイデアは次のようなものを追加することです:
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}
}{}
}{}
},
},
2回目の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}
結果
でも、どうすれば
- 最初の列から始まる複数列
- Y-Pos情報を含む2行目を非表示にする
Content Description
この場合、説明の実際の内容に置き換えますかPowerSupply
?
答え1
と を使用した解決策は、あなたにとって受け入れられるでしょうcsvsimple-l3
かtabularray
?
\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
通常の を使用することもできますが、最後の列の列タイプtabular
に関する問題を回避するために、5 番目のダミー列というトリックを使用します。siunitx
\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}
注意: このマクロは\IfCsvsimStrEqualTF
ごく最近のものです。ディストリビューションが最新でない場合は、\ifcsvstrcmp
代わりに を使用してください。上記の両方の例では、古いマクロを使用しても結果は変わりません。
答え2
OpTeX ユーザー向けの解決策は次のとおりです。
\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