![csvloop,\expandafter\newcommand\csname 和 \csxdef 中的电子表格差异](https://linux22.com/image/331795/csvloop%EF%BC%8C%5Cexpandafter%5Cnewcommand%5Ccsname%20%E5%92%8C%20%5Ccsxdef%20%E4%B8%AD%E7%9A%84%E7%94%B5%E5%AD%90%E8%A1%A8%E6%A0%BC%E5%B7%AE%E5%BC%82.png)
我不知道为什么,但是当我测试一个简单的 .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
(并且也无法保留)。例如,\xdef
UTF-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}}%
}
会做。