Excelファイルをtxtファイルに変換してNotebookLMに食わせる
Table of Contents
背景・動機
利用規約の関係で明確に言及できないが、某ECプラットフォーム(以下 A社)とのAPI連携を実装していた。
A社のAPI含む全体的なドキュメントの管理方法は次のようになっている。
- APIの情報がWeb上に公開されていない
- 技術ブログに書いている人がいない
- 管理画面を使うには申請が必要
- 管理画面の奥の方にAPIドキュメントがある
- APIドキュメントをzipでダウンロードする方式
- EndpointごとにExcelファイルが入っている
- セルの結合などを駆使して見易いように書かれている
- Excelのシートが複数枚ある
- エラーメッセージなどは別のダウンロードリンクに纏まっている
開発する上で次のような問題を抱えていた。
- 今回の対応で必要なEndpointの取捨選択を効率的にしたい
- ひとつずつExcelファイルを開いて確認するのが面倒
- 横断した情報の整合性を確認するのが大変
今回のようにExcelファイルが与えられた時にどう対応するべきなのか後学の為にメモしておく。
試したこと・やったこと
1. ExcelファイルをGoogle Driveにアップロードする
ExcelファイルをGoogle DriveにアップロードするとSpreadSheetから閲覧できる。 こうすることで、ExcelファイルにURL Linkからアクセスすることが可能になるのがよい。
2. Excelファイルを文字列に起こす
xlsx2csv
を使ってcsvファイルに変換する。
$ xlsx2csv -s 2 tmp.xlsx > tmp.csv
-s
オプションでシート番号を指定できる。
usage: xlsx2csv [-h] [-v] [-a] [-c OUTPUTENCODING] [-d DELIMITER] [--hyperlinks] [-e] [--no-line-breaks] [-E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...]] [-f DATEFORMAT] [-t TIMEFORMAT]
[--floatformat FLOATFORMAT] [--sci-float] [-I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...]] [--exclude_hidden_sheets] [--ignore-formats IGNORE_FORMATS [IGNORE_FORMATS ...]]
[-l LINETERMINATOR] [-m] [-n SHEETNAME] [-i] [--skipemptycolumns] [-p SHEETDELIMITER] [-q QUOTING] [-s SHEETID] [--include-hidden-rows]
xlsxfile [outfile]
xlsx to csv converter
positional arguments:
xlsxfile xlsx file path, use '-' to read from STDIN
outfile output csv file path
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-a, --all export all sheets
-c OUTPUTENCODING, --outputencoding OUTPUTENCODING
encoding of output csv ** Python 3 only ** (default: utf-8)
-d DELIMITER, --delimiter DELIMITER
delimiter - columns delimiter in csv, 'tab' or 'x09' for a tab (default: comma ',')
--hyperlinks, --hyperlinks
include hyperlinks
-e, --escape Escape \r\n\t characters
--no-line-breaks, --no-line-breaks
Replace \r\n\t with space
-E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...], --exclude_sheet_pattern EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...]
exclude sheets named matching given pattern, only effects when -a option is enabled.
-f DATEFORMAT, --dateformat DATEFORMAT
override date/time format (ex. %Y/%m/%d)
-t TIMEFORMAT, --timeformat TIMEFORMAT
override time format (ex. %H/%M/%S)
--floatformat FLOATFORMAT
override float format (ex. %.15f)
--sci-float force scientific notation to float
-I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...], --include_sheet_pattern INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...]
only include sheets named matching given pattern, only effects when -a option is enabled.
--exclude_hidden_sheets
Exclude hidden sheets from the output, only effects when -a option is enabled.
--ignore-formats IGNORE_FORMATS [IGNORE_FORMATS ...]
Ignores format for specific data types.
-l LINETERMINATOR, --lineterminator LINETERMINATOR
line terminator - lines terminator in csv, '\n' '\r\n' or '\r' (default: \n)
-m, --merge-cells merge cells
-n SHEETNAME, --sheetname SHEETNAME
sheet name to convert
-i, --ignoreempty skip empty lines
--skipemptycolumns skip trailing empty columns
-p SHEETDELIMITER, --sheetdelimiter SHEETDELIMITER
sheet delimiter used to separate sheets, pass '' if you do not need delimiter, or 'x07' or '\f' for form feed (default: '--------')
-q QUOTING, --quoting QUOTING
quoting - fields quoting in csv, 'none' 'minimal' 'nonnumeric' or 'all' (default: minimal)
-s SHEETID, --sheet SHEETID
sheet number to convert
--include-hidden-rows
include hidden rows
次のように再帰的に実行するのでもよい。
$ find . -name '*.xlsx' -exec bash -c 'for f; do out="${f%.xlsx}.csv"; xlsx2csv -s 2 "$f" > "$out"; done' bash {} +
3. NotebookLMにアップロードする
NotebookLMはcsvアップロードに対応していないので、いったんtxtに変換してアップロードする。
$ find . -type f -name '*.csv' -print0 | while IFS= read -r -d '' file; do mv "$file" "${file%.csv}.txt"; done
あとはよしなにNotebookLMに質問する。
得られた結果・所感
変換されたcsvはセル結合のせいでだいぶ酷い形式だが、NotebookLMを介することによって圧倒的に読みやすくなった。 管理画面上のAPIに関する情報もついでに食わせることによって自分の疑問がかなり晴れたし、どこから参照したのかも教えてくれるので自分でも確認できるのがNotebookLMのよい所だなとあらためて感じた。
xlsx2csv
はnixpkgsで提供してくれているので、雑に nix-shell
で隔離したShell環境に入ればよい。
$ nix-shell -p xlsx2csv
今後の展開・検討事項
Excelだと読み辛いのでopenapi.yamlをNotebookLMに生成させて、openapiからTypeScriptを生成する。