.csv
간단한 구조로 구성된 엄청난 양의 데이터 행이 있고 이러한 데이터 행을 다양한 데이터 유형으로 나눌 수 있다고 가정해 보겠습니다 .
MWE에서는 두 가지 유형( typA
& typB
)을 추가했습니다.
행에 가 포함된 경우 typA
테이블은 그대로 인쇄되어 결과에 표시되어야 합니다.
행에 가 포함된 경우 typB
이 행은 필드의 내용만 Description
중앙에 인쇄되는 다중 열 행이어야 합니다.
LaTeX로 어떻게 이를 달성할 수 있나요? :)
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}
결과
예상 결과
편집하다
내 아이디어는 다음과 같은 것을 추가하는 것입니다.
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}
}{}
}{}
},
},
두 번째 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 정보로 두 번째 행을 억제합니다.
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}
NB = 매크로가 \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