Angenommen, ich habe eine Excel-Tabellendatei data.xlsx
mit dem Inhalt
A B
1 Third Parameter 7
2 First Parameter 5
3 Second Parameter 3
und ich möchte den Wert in Spalte B anhand des entsprechenden Textes in Spalte A nachschlagen.
Mit anderen Worten, ich brauche einen Latex-Befehl wie zum Beispiel \getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}
. So wird zum Beispiel \getValue{\rdPar}{Third Parameter}{data.xlsx}
der Wert von 7
in gespeichert \rdPar
, um ihn später in meinem Latex-Dokument zu verwenden.
PS Vielleicht,diese Frageist hilfreich, aber ich weiß nicht, wie ich die Antworten meinen Bedürfnissen entsprechend bearbeiten kann.
Antwort1
Vorausgesetzt, Sie können .csv
anstelle von verwenden .xls(x)
, gibt es mehrere Tools zum Bearbeiten von CSV-Dateien, beispielsweise csvsimple
.
Wenn Sie das Rad neu erfinden möchten: Sie können die Datei in eine Schlüssel-Wert-Struktur \ReadCSV
einlesen und diese Werte dann bei Bedarf abrufen. Die Syntax lautet:.csv
\getValue
\ReadCSV
\ReadCSV [*] {<label>} [<name>,<value>] {<file>}
\ReadCSV
liest die CSV-Datei <file>
, nimmt die Spalten <name>
und <value>
( <name>
und <value>
sind die Anzahl der Spalten; Standard sind <name>=1
und <value>=2
) und speichert sie <label>
für später unter . Wenn das optionale Element *
verwendet wird, wird die Datei als Zeichenfolge gelesen.
Sobald die Datei gelesen ist, können Sie die gespeicherten Werte mit folgendem Befehl abrufen \getValue
:
\getValue <macro> {<name>} {<label>}
\getValue
holt sich die <value>
jeweilige Spalte <name>
aus der unter ausgelesenen CSV-Datei <label>
und speichert diese im <macro>
.
In Ihrem Beispiel (Entfernen der Kopfzeile und -spalte) hätten Sie:
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7
Hier ist die expl3
Implementierung (sie ist minimalistisch: Es gibt keine Fehlerprüfung auf falsche Eingabe, fehlende Daten usw.):
\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}