是否有一个 LaTeX 包,它可以导入数据csv
并遵守转义的引文?
确切地说,我指的是使用规则 1. - 7.https://www.rfc-editor.org/rfc/rfc4180#section-2
pgfplotstable
似乎都不起作用simplecsv
——它们都错误地将引用的逗号解析为字段分隔符。
column1, column2
value,"A quoted, value"
value2,A value
value3,"a ""value"""
第 1 行(数据)导致pgfplotstable
错误:Table 'data.csv' appears to have too many column
。标题、第 2 行和第 3 行呈现正常。
期望输出是:
column1 | column2
---------+---------------------
value | A quoted, value
value2 | A value
value3 | a "value"
我发现的唯一解决方案是手动用{}
括号将字段括起来,但这显然很麻烦。
编辑:在原始文件中,只有包含逗号和引号的字段被引用
编辑2:我知道将引号改为正确的“”对可能会很复杂;我对此不感兴趣。
答案1
似乎它尚未实现,但可以花些力气完成。我修改现有宏的速度太快了,所以 Christian 应该知道我是否在这里破坏了任何东西。新设置可以通过 来使用col sep=double quotes
。但它不支持另一个带引号的列,因为它是一个模糊的开头和结尾字符。
\documentclass{standalone}
\usepackage{pgfplotstable}
\makeatletter
\pgfkeys{/pgfplots/table/col sep/double quotes/.code = {\def\pgfplotstableread@COLSEP@CASE{7}}}
{%
\catcode`\ =10
\catcode`\;=12
\catcode`\:=12
\gdef\pgfplotstableread@impl@prepare@DO{%
\ifcase\pgfplotstableread@COLSEP@CASE\relax
% col sep=space:
\catcode`\ =10
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1 \pgfplotstable@EOI}%
\or
% col sep=comma:
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COMMA
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1,\pgfplotstable@EOI}%
\or
% col sep=semicolon:
\catcode`\;=12
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1;\pgfplotstable@EOI}%
\or
% col sep=colon:
\catcode`\:=12
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COLON
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1:\pgfplotstable@EOI}%
\or
% col sep=brace:
% allow multi line cells:
\endlinechar=\pgfplotstableread@oldendlinechar\relax
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@BRACE
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1\pgfplotstable@EOI}%
\or
% col sep=tab:
\catcode`\^^I=12
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@TAB
\long\edef\pgfplotstableread@impl@DO@##1{\noexpand\pgfplotstableread@impl@ITERATE##1\pgfplotstableread@tab\noexpand\pgfplotstable@EOI}%
\or
% col sep=&:
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@AMPERSAND
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1&\pgfplotstable@EOI}%
\or
% col sep="
\let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@DOUBLEQUOTES
\long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1\pgfplotstable@EOI}%
\fi
}%
}%
\long\def\pgfplotstableread@impl@ITERATE@NEXT@DOUBLEQUOTES#1"{%
\pgfplotstableread@impl@ITERATE@NEXT@{#1}%
\pgfplotstableread@impl@ITERATE
}%
\makeatother
\begin{document}
\pgfplotstableread[col sep=double quotes]{
A,"the comma , and some space,"
B," followed by another awkward."
}\mytable
\pgfplotstabletypeset[string type]{\mytable}
\end{document}
我没有删除逗号,因为我不确定你是否需要它们。你也可以再次引入引号,但如果要进行排版,最好使用 csquotes 包或至少`` ... "
使用对来正确呈现开头的引号。