arquivos pgfplotstablesave e CSV

arquivos pgfplotstablesave e CSV

Este arquivo grava um arquivo CSV:

\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\pgfplotstableread[col sep=comma]{
  1,2
  3,4
  5,6
  7,8
  9,10
}\data
\begin{document}
\pgfplotstablesave[col sep=comma]{\data}{data.csv}
\end{document}

O arquivo CSV fica assim:

0,1,
1,2,
3,4,
5,6,
7,8,
9,10,

Existe uma maneira de evitar a vírgula no final de cada linha?

Responder1

Sim é possível mas pelo que descobri é necessário redefinir a macro interna. Tudo que fiz foi substituir

\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%

em \pgfplotstablesave@implpor

\ifnum\pgfplotstablecol<\pgfplotstablecols
  \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
\else
  \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka}%
\fi

Aqui \pgfplotstablecolestá a coluna atual e \pgfplotstablecolso número de colunas. A vírgula só será adicionada se o \pgfplotstablecol<\pgfplotstablecols. Esta é uma primeira implementação.

\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\makeatletter
\def\pgfplotstablesave@impl[#1]#2#3{%
    \pgfplotstabletypeset[%
        reset styles,%
        disable rowcol styles,%
        begin table={},%
        end table={},%
        typeset cell/.code={%
            \begingroup
            \t@pgfplots@toka={##1}%
            \ifcase\pgfplotstableread@OUTCOLSEP@CASE\relax
                % col sep=SPACE:
                \t@pgfplots@tokb=\expandafter{\pgfplotstableread@tab}%
                \pgfplots@ifempty{##1}{%
                    \t@pgfplots@toka={{}}%
                }{}%
                \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
            \or
                % col sep=comma:
                \t@pgfplots@tokb={,}%
                \ifnum\pgfplotstablecol<\pgfplotstablecols
                  \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
                \else
                  \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka}%
                \fi
            \or
                % col sep=semicolon:
                \t@pgfplots@tokb={;}%
                \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
            \or
                % col sep=colon:
                \t@pgfplots@tokb={:}%
                \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
            \or
                % col sep=braces:
                \xdef\pgfplots@glob@TMPc{{\the\t@pgfplots@toka}}%
            \or
                % col sep=tab:
                \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\pgfplotstableread@tab}%
            \or
                % col sep=&:
                \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka&}%
            \fi
            \endgroup
            \pgfkeyslet{/pgfplots/table/@cell content}\pgfplots@glob@TMPc%
        },%
        before row=,%
        after row=,%
        skip coltypes,%
        typeset=false,%
        string type,%
        TeX comment=,%
        columns=,%
        font=,%
        /pgfplots/table/col sep/.is choice,%
        /pgfplots/table/col sep/space/.code     = {\def\pgfplotstableread@OUTCOLSEP@CASE{0}},%
        /pgfplots/table/col sep/comma/.code     = {\def\pgfplotstableread@OUTCOLSEP@CASE{1}},%
        /pgfplots/table/col sep/semicolon/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{2}},%
        /pgfplots/table/col sep/colon/.code     = {\def\pgfplotstableread@OUTCOLSEP@CASE{3}},%
        /pgfplots/table/col sep/braces/.code    = {\def\pgfplotstableread@OUTCOLSEP@CASE{4}},%
        /pgfplots/table/col sep/tab/.code       = {\def\pgfplotstableread@OUTCOLSEP@CASE{5}},%
        /pgfplots/table/col sep/&/.code         = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
        /pgfplots/table/col sep/ampersand/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
        /pgfplots/table/col sep=space,%
        /pgfplots/table/in col sep/.is choice,%
        /pgfplots/table/in col sep/space/.code      = {\def\pgfplotstableread@COLSEP@CASE{0}},%
        /pgfplots/table/in col sep/comma/.code      = {\def\pgfplotstableread@COLSEP@CASE{1}},%
        /pgfplots/table/in col sep/semicolon/.code  = {\def\pgfplotstableread@COLSEP@CASE{2}},%
        /pgfplots/table/in col sep/colon/.code      = {\def\pgfplotstableread@COLSEP@CASE{3}},%
        /pgfplots/table/in col sep/braces/.code     = {\def\pgfplotstableread@COLSEP@CASE{4}},%
        /pgfplots/table/in col sep/tab/.code        = {\def\pgfplotstableread@COLSEP@CASE{5}},%
        /pgfplots/table/in col sep/&/.code          = {\def\pgfplotstableread@COLSEP@CASE{6}},%
        /pgfplots/table/in col sep/ampersand/.code  = {\def\pgfplotstableread@COLSEP@CASE{6}},%
        /pgfplots/table/in col sep=space,%
        % WARNING: you NEED a '%' before '#1':
        #1,%
        /pgfplots/table/include outfiles=false,
        /pgfplots/table/outfile={#3}%
    ]{#2}%
}%
\makeatother
\pgfplotstableread[col sep=comma]{
  1,2
  3,4
  5,6
  7,8
  9,10
}\data
\begin{document}
\pgfplotstablesave[col sep=comma,after row={}]{\data}{data.csv}

Hello
\end{document}

resulta em

0,1
1,2
3,4
5,6
7,8
9,10

Por enquanto só fiz isso para o caso de vírgula, mas é fácil aplicá-lo a todos os separadores de colunas. No entanto, sinto que devemos fazer uma solicitação de recurso (se não houver uma solução integrada). Também pode ser mais seguro adicionar uma chave que ative essa modificação somente se o usuário assim o desejar (mesmo que eu ache que esse deveria ser o padrão), para não quebrar códigos mais antigos.

informação relacionada