Excelスプレッドシートファイルdata.xlsx
の内容が
A B
1 Third Parameter 7
2 First Parameter 5
3 Second Parameter 3
列 A の対応するテキストを使用して、列 B の値を検索したいと思います。
つまり、たとえば のような Latex コマンドが必要です。\getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}
つまり、たとえばは\getValue{\rdPar}{Third Parameter}{data.xlsx}
の値をLaTeX ドキュメントで後で使用するために に保存します。7
\rdPar
追伸 たぶん、この質問役に立ちますが、自分のニーズに合わせて回答を編集する方法がわかりません。
答え1
.csv
の代わりにを使用できると仮定すると.xls(x)
、CSV ファイルを操作するためのツールがいくつかあります (例csvsimple
: )。
ただし、車輪を再発明したい場合は、 を使用してファイルをキー値構造に\ReadCSV
読み込み、必要に応じてそれらの値を取得できます。 の構文は次のとおりです。.csv
\getValue
\ReadCSV
\ReadCSV [*] {<label>} [<name>,<value>] {<file>}
\ReadCSV
は CSV を読み取り<file>
、列<name>
と<value>
(<name>
と は<value>
列の数です。デフォルトは<name>=1
と です<value>=2
) を取得して、後で使用するために に保存します<label>
。オプション*
が使用されている場合、ファイルは文字列として読み取られます。
ファイルが読み込まれたら、次のコマンドを使用して保存された値を取得できます\getValue
。
\getValue <macro> {<name>} {<label>}
\getValue
は、 で読み込まれた CSV ファイル内の<value>
それぞれの列を取得し、 に保存します。<name>
<label>
<macro>
あなたの例(ヘッダー行と列を削除)では、次のようになります。
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7
実装は次のとおりですexpl3
(最小限のものであり、間違った入力や欠落したデータなどのエラー チェックはありません)。
\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}