pgfplotstable의 셀 내용을 기준으로 다중 열과 단일 열을 구별합니다.

pgfplotstable의 셀 내용을 기준으로 다중 열과 단일 열을 구별합니다.

다음과 같은 .csv 파일이 있습니다.

\begin{filecontents}{data.csv}
  type,Description,Value
  typA,Description0,Value0
  typA,Description1,Value1
  typB,Description2,Value2
  typA,Description3,Value3
\end{filecontents}

컬럼 의 내용에 따라 type다중 컬럼과 단일 컬럼을 구분하고 싶습니다.

typB이 간단한 MWE에는 언급된 행 외에 항상 단일 열이 있어야 합니다 . 이 경우 그림과 같이 설명만 행 중앙에 인쇄되어야 합니다.

내 생각엔 이게 이것과 비슷할 것 같아https://tex.stackexchange.com/a/459848/104358질문이 있지만 제 경우에는 하드 코딩된 특정 행을 설정하고 싶지 않습니다. 유형 열의 내용을 확인하여 즉시 계산해야 합니다.

의 도움으로 이를 달성하려고 시도했지만 환경 \pgfplotstablegetelem에 정의되어 있지 않은 것 같습니다 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}

여기에 이미지 설명을 입력하세요

답변1

내 문제를 해결할 해결책을 찾았습니다! 아마도 최고는 아닐 수도 있지만 여전히 작동합니다!

비결은 (Head Row 포함) 부터 계산을 시작 하지만 (Head Row 뒤) 부터 시작하기 \pgfplotstablerow=-1때문에 이것이 필요하다는 특별한 경우를 갖는 것입니다 .\pgfplotstablerow-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}

결과

여기에 이미지 설명을 입력하세요

관련 정보