Suponha que eu tenha um arquivo de planilha Excel data.xlsx
cujo conteúdo é
A B
1 Third Parameter 7
2 First Parameter 5
3 Second Parameter 3
e gostaria de procurar o valor na coluna B usando o texto correspondente na coluna A.
Em outras palavras, preciso ter um comando Latex como, por exemplo, \getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}
. Assim, por exemplo, \getValue{\rdPar}{Third Parameter}{data.xlsx}
armazenarei o valor de 7
in \rdPar
para ser usado posteriormente em meu documento latex.
PS Talvez,essa questãoé útil, mas não sei como editar as respostas de acordo com minha necessidade.
Responder1
Supondo que você possa usar .csv
em vez de .xls(x)
, existem diversas ferramentas para manipular arquivos CSV, por exemplo csvsimple
.
Porém, se você quiser reinventar algumas rodas: você pode usar \ReadCSV
para ler o .csv
arquivo em uma estrutura de valor-chave e, em seguida, \getValue
buscar esses valores quando necessário. A sintaxe de \ReadCSV
é:
\ReadCSV [*] {<label>} [<name>,<value>] {<file>}
\ReadCSV
irá ler o CSV <file>
e pegar as colunas <name>
e <value>
( <name>
e <value>
são o número das colunas; os padrões são <name>=1
e <value>=2
) e salvá-las em <label>
para mais tarde. Se o opcional *
for usado, o arquivo será lido como uma string.
Depois que o arquivo for lido, você pode buscar os valores salvos usando \getValue
:
\getValue <macro> {<name>} {<label>}
\getValue
irá buscar a <value>
coluna do respectivo <name>
arquivo CSV lido em <label>
e salvá-la no arquivo <macro>
.
No seu exemplo (removendo linha e coluna do cabeçalho), você teria:
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7
Aqui está a expl3
implementação (é minimalista: não há verificação de erros para entradas erradas, dados ausentes, etc.):
\begin{filecontents*}{test.csv}
Third Parameter , 7
First Parameter , 5
Second Parameter , 3
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% Step 1: reading the file
\ior_new:N \l__diaa_csv_ior
\bool_new:N \l__diaa_csv_str_bool
\NewDocumentCommand \ReadCSV { s m >{ \SplitArgument {1} {,} }O{ 1,2 } m }
{
\IfBooleanTF {#1}
{ \bool_set_true:N \l__diaa_csv_str_bool }
{ \bool_set_false:N \l__diaa_csv_str_bool }
\diaa_csv_read:nnnn {#2} #3 {#4}
}
\cs_new_protected:Npn \diaa_csv_read:nnnn #1 #2 #3 #4
{
\prop_new:c { g__diaa_csv_#1_prop }
\ior_open:NnTF \l__diaa_csv_ior {#4}
{ \__diaa_csv_read:cnn { g__diaa_csv_#1_prop } {#2} {#3} }
{ \msg_error:nnn { diaa } { file-not-found } {#4} }
}
\msg_new:nnn { diaa } { file-not-found }
{ File~`#1'~not~found. }
\cs_new_protected:Npn \__diaa_csv_read:Nnn #1 #2 #3
{
\bool_if:NTF \l__diaa_csv_str_bool
{ \ior_str_map_inline:Nn }
{ \ior_map_inline:Nn }
\l__diaa_csv_ior
{
\prop_put:Nxx #1
{ \clist_item:nn {##1} {#2} }
{ \clist_item:nn {##1} {#3} }
}
}
\cs_generate_variant:Nn \__diaa_csv_read:Nnn { c }
%
% Step 2: getting the values
\NewDocumentCommand \getValue { m m m }
{ \tl_set:Nx #1 { \diaa_csv_item:nn {#2} {#3} } }
\NewExpandableDocumentCommand \CSVItem { m m }
{ \diaa_csv_item:nn {#1} {#2} }
\cs_new:Npn \diaa_csv_item:nn #1 #2
{ \prop_item:cn { g__diaa_csv_#2_prop } {#1} }
\ExplSyntaxOff
\begin{document}
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar
\edef\rdPar{\CSVItem{First Parameter}{mydata}}%
\rdPar
\end{document}