![pgfplotstablesave und CSV-Dateien](https://rvso.com/image/405339/pgfplotstablesave%20und%20CSV-Dateien.png)
Diese Datei gibt eine CSV-Datei aus:
\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}
Die CSV-Datei sieht folgendermaßen aus:
0,1,
1,2,
3,4,
5,6,
7,8,
9,10,
Gibt es eine Möglichkeit, das Komma am Ende jeder Zeile zu vermeiden?
Antwort1
Ja, das ist möglich, aber meiner Meinung nach müssen Sie das interne Makro neu definieren. Ich habe lediglich Folgendes ersetzt:
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
in \pgfplotstablesave@impl
von
\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
Hier \pgfplotstablecol
ist die aktuelle Spalte und \pgfplotstablecols
die Anzahl der Spalten. Das Komma wird nur hinzugefügt, wenn das \pgfplotstablecol<\pgfplotstablecols
. Dies ist eine erste Implementierung.
\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}
führt zu
0,1
1,2
3,4
5,6
7,8
9,10
Im Moment habe ich das nur für den Fall des Kommas gemacht, aber es ist einfach, es auf alle Spaltentrennzeichen anzuwenden. Dennoch bin ich der Meinung, dass man eine Funktionsanforderung stellen sollte (wenn es keine integrierte Lösung gibt). Es könnte auch sicherer sein, einen Schlüssel hinzuzufügen, der diese Änderung nur aktiviert, wenn der Benutzer dies angibt (obwohl ich der Meinung bin, dass dies die Standardeinstellung sein sollte), um ältere Codes nicht zu beschädigen.