csvloop,\expandafter\newcommand\csname 和 \csxdef 中的电子表格差异

csvloop,\expandafter\newcommand\csname 和 \csxdef 中的电子表格差异

我不知道为什么,但是当我测试一个简单的 .tex 文件时,我的 csvloop 工作正常,但是当我在我的案例中测试时,情况要复杂得多,它无法编译并且我没有任何错误消息,所以很难知道为什么它无法编译。

这是我的简单代码,运行良好:

\documentclass[a4paper,12pt,hidelinks]{article}

\usepackage[utf8]{inputenc} 
%\usepackage[utf8x]{inputenc} 
\usepackage[brazil]{babel}
\usepackage[T1]{fontenc}

\usepackage{filecontents}
\usepackage{csvsimple}
\usepackage{xstring}
\usepackage{alphalph}
\usepackage{etoolbox}

\begin{document}

\newcommand \local {1}


\newcommand{\definekeytovalue}[2]{%
  \csxdef{#1}{#2}%
}

% \newcommand{\definekeytovalue}[2]{%
%   \expandafter\newcommand\csname     #1\expandafter\expandafter\expandafter\endcsname\expandafter\expandafter\expandafter{#2}
% }

\newcommand \auxcsv[1]{
\csvloop{
  file={./CSV/gdl.csv},
  separator=semicolon,
  head to column names,
  command=\definekeytovalue{\Dados}{#1}
}
}

% \IfStrEqCase{\local}{{1}{\auxcsv{\LocalA}}{2}{\auxcsv{\LocalB}}{3}    {\auxcsv{\LocalC}}{4}{\auxcsv{\LocalD}}{5}{\auxcsv{\LocalE}}{6}    {\auxcsv{\LocalF}}{7}{\auxcsv{\LocalG}}{8}{\auxcsv{\LocalH}}{9}{\auxcsv{\LocalI}}{10}{\auxcsv{\LocalJ}}{11}{\auxcsv{\LocalK}}{12}{\auxcsv{\LocalL}}{13}{\auxcsv{\LocalM}}{14}{\auxcsv{\LocalN}}{15}{\auxcsv{\LocalO}}{16}{\auxcsv{\LocalP}}{17}{\auxcsv{\LocalQ}}{18}{\auxcsv{\LocalR}}{19}{\auxcsv{\LocalS}}{20}{\auxcsv{\LocalT}}}[]

\auxcsv{\csname Local\AlphAlph{\local}\endcsname}

endereço: {\localcrime}, número {\numlocalcrime}, bairro {\bairro}.\\

\end{document}

我的 csv 文件是:

Dados;LocalA;LocalB;LocalC;LocalD
REP;163419;163464;163498;163511
teste;163419_2016;163464_2016;163498_2016;163511_2016
etiqueta;L 01191/16;L 01192/16;L 01193/16;L 01194/16
bo;1459/2016;;900050/2016;
rdo;;;;
ip;;;;
tc;;;;
horareq;19:26h;21:37h;00:47h;02:26h
diareq;08;08;09;09
mesreq;04;04;04;04
anoreq;2016;2016;2016;2016
diaat;08;08;09;09
mesat;04;04;04;04
anoat;2016;2016;2016;2016
depol;07º;46º;91º;33º
natureza;ACIDENTE DE TRÂNSITO;LESÃO CORPORAL CULPOSA NA DIREÇÃO DE VEÍCULO AUTOMOTOR;JOGO DE AZAR;JOGO DE AZAR
delegado;Fernando José Gregoraci;Thiago Húngaro;Fernando Antonio C.\ Terzidis;Thiago José Dos Santos Húngaro
oad;o;o;o;o
mun;São Paulo;São Paulo;São Paulo;São Paulo
munoc;São Paulo;São Paulo;São Paulo;São Paulo
localcrime;Haroldo Pacheco E.\ Silva;Rodovia Anhanguera;Rua Carlos Vicari;Rua Jonas Eudoque dos Santos
numlocalcrime;29;27;267;79
horachegada;21:01h;23:30h;01:55h;03:02h
horasaida;;;;
diaoc;08;08;08;
mesoc;04;04;04;
anooc;2016;2016;2016;
horaoc;17:50h;19:20h;22:04h;
periodo;n;n;n;n
meteorologia;As condições meteorológicas para o dia da elaboração dos Exames Periciais tratava-se de céu ensolarado, com temperatura média de 31ºC, umidade relativa de 55\%, visibilidade de 25,91 km, vento na direção E de 6,44 km/h e pressão de 32.170,71 mBar.;As condições meteorológicas para o dia da elaboração dos Exames Periciais tratava-se de céu ensolarado, com temperatura média de 31ºC, umidade relativa de 55\%, visibilidade de 25,91 km, vento na direção E de 6,44 km/h e pressão de 32.170,71 mBar.;As condições meteorológicas para o dia da elaboração dos Exames Periciais tratava-se de céu ensolarado, com temperatura média de 31ºC, umidade relativa de 55\%, visibilidade de 25,91 km, vento na direção E de 6,44 km/h e pressão de 32.170,71 mBar.;As condições meteorológicas para o dia da elaboração dos Exames Periciais tratava-se de céu ensolarado, com temperatura média de 31ºC, umidade relativa de 55\%, visibilidade de 25,91 km, vento na direção E de 6,44 km/h e pressão de 32.170,71 mBar.
bairro;Vila Ipojuca;;Água Branca;Jardim Santo Elias
difquinze;;;;
tipoveiculo;AUTOMÓVEL;AUTOMÓVEL;;
placa;LZJ-2540;CCP-9847;;
marca;GENERAL MOTORS;FORD;;
modelo;CORSA WIND;ESCORT XR3;;
cor;BRANCA;AZUL;;
anomodelo;1996;1987;;
foradesp;;;;
importado;n;n;;
tipoveiculob;AUTOMÓVEL;ÔNIBUS;;
placab;CVS-1421;FRM-8132;;
marcab;FIAT;MERCEDES BENZ;;
modelob;PALIO ELX;INDUSCAR APACHE U;;
corb;CINZA;AZUL;;
anomodelob;2000;2014;;
foradespb;;Osasco - SP;;
importadob;n;n;;
tipoveiculoc;AUTOMÓVEL;;;
placac;EGU-6747;;;
marcac;TOYOTA;;;
modeloc;COROLLA XLI18FLEX;;;
corc;CINZA;;;
anomodeloc;2009;;;
foradespc;Santana de Parnaiba - SP;;;
importadoc;n;;;

我的代码可以很好地编译:

  \newcommand{\definekeytovalue}[2]{%
   \expandafter\newcommand\csname #1\expandafter\expandafter\expandafter\endcsname\expandafter\expandafter\expandafter{#2}
 }
 \IfStrEqCase{\local}{{1}{\auxcsv{\LocalA}}{2}{\auxcsv{\LocalB}}{3}{\auxcsv{\LocalC}}{4}{\auxcsv{\LocalD}}{5}{\auxcsv{\LocalE}}{6}{\auxcsv{\LocalF}}{7}{\auxcsv{\LocalG}}{8}{\auxcsv{\LocalH}}{9}{\auxcsv{\LocalI}}{10}{\auxcsv{\LocalJ}}{11}{\auxcsv{\LocalK}}{12}{\auxcsv{\LocalL}}{13}{\auxcsv{\LocalM}}{14}{\auxcsv{\LocalN}}{15}{\auxcsv{\LocalO}}{16}{\auxcsv{\LocalP}}{17}{\auxcsv{\LocalQ}}{18}{\auxcsv{\LocalR}}{19}{\auxcsv{\LocalS}}{20}{\auxcsv{\LocalT}}}[]

并超时:

\newcommand{\definekeytovalue}[2]{%
  \csxdef{#1}{#2}%
}
\auxcsv{\csname Local\AlphAlph{\local}\endcsname}

为什么??

答案1

问题是 CSV 文件中的某些条目无法保留\edef(并且也无法保留)。例如,\xdefUTF-8 实体就存在风险。º

在您的例子中#2\csname Local\AlphAlph{\local}\endcsname,它可以扩展为\LocalA\LocalB等等。 的定义\LocalA\csvcolii,这反过来又扩展为当前行中第二个字段的内容。

更复杂的定义中的三元组\expandafter只负责扩展两次,而不会扩展更多;而是\csxdef进行完全扩展并º失败。

你可以获得双倍扩展,仅此而已

\newcommand{\definekeytovalue}[2]{%
  \csxdef{#1}{\unexpanded\expandafter\expandafter\expandafter{#2}}%
}

etoolbox包提供了\expandonce,但这还不够;您可以添加

\newcommand\expandtwice[1]{%
  \unexpanded\expandafter\expandafter\expandafter{#1}%
}

\newcommand{\definekeytovalue}[2]{%
  \csxdef{#1}{\expandtwice{#2}}%
}

会做。

相关内容