【質問】
CSVファイル(またはExcelファイル)をデータベースに見立ててSQL文でデータを抽出する方法はないか。
データセット化してループしながらデータを探していると読み飛ばしが多く効率が悪い。
件数の多いCSVファイル、Excelファイルだと目的のデータを1件探すだけでも10分かかってしまう。
【回答】
以下の設定をすることにより可能となります。
<必要条件>
Microsoft Access Text Driver(*.txt, *.csv)が使用可能
64bit版OS + 64bit版AutoMateの場合は、64bit版のODBCドライバーが必要
(そうでないと、アクション実行時に「アーキテクチャの不一致」エラーとなります)
なお、64bit版ODBCドライバーは、下記の弊社ダウンロードリンクよりダウンロードいただけます。
【Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント】
https://www.sct.co.jp/download/automate/module/AccessDatabaseEngine_X64.exe
以下の手順では、64bit版OSにおける手順とします。
<手順<
1. 「ODBC管理(64bit)」から、「ユーザーDSN」または「システムDSN」にて「追加」を選択
2. Microsoft Access Text Driver(*.txt, *.csv)を選択し「完了」をクリック
3. 「データソース名」および「説明」に任意の名前・説明を入力(例では、「CSVREADER」とする
「OK」をクリックする
(フォルダーについては、後ほど対象ファイルをフルパスで選択するので選択の必要は無し)
4. ODBCデータソース定義一覧に追加されることを確認する
確認後、ODBCデータソースアドミニストレーターは「x」で閉じる
5. 以下、AutoMate側からの設定
「データベース - SQLクエリー」アクションで
「接続」に「ホスト」を選択し、「接続を編集する」をクリック
6. 「プロバイダー」タブを選択し、「Microsoft OLE DB Provider for ODBC Drivers」を選択
「次へ」をクリック
7. 「データソース名を使用する」はプルダウンリストから「CSVREADER」を選択
「接続のテスト」をクリックし、成功することを確認後、「OK」をクリック
「接続のテスト」成功後、データリンクプロパティを「OK」で閉じる
8. SQL文・および結果を格納するデータセット名を記入
例:SELECT * FROM %USERPROFILE%\desktop\DB.csv where ID > 1;
(例では、デスクトップ上の「DB.csv」からID >1の行すべてをSELECTしている)
SELECT 対象列 FROM ファイル名(フルパス) where句
のフォーマットでSQL文を書く
SQL文等指定後、「OK」をクリックする
10. 参考:複数のCSVファイルを結合してSELECTする場合の例:
select A.ID, B.MISE_NAME, A.SHOHINMEI
from %USERPROFILE%\desktop\テスト.csv A
inner join %USERPROFILE%\desktop\店.csv B on A.MISE_CODE=B.MISE_CODE
where A.SHOHINMEI = '魚';
11. 参考2:Excelファイルに対して同様の処理を行う場合
ODBCドライバーは「Microsoft Excel Driver(*.xls, *.xlsx, *.xlsm, *.xlsb)
に読み替えてください。
また、SQL文を組み立てる際には、シートの指定として、
`Excelブック名(フルパス)`.`シート名$`
が必要となります。(「$」は省略できません)
(例)
SELECT `A`.PRODUCTION_ID, `A`.SHOHINCODE, `B`.HOGE FROM
`%USERPROFILE%\Desktop\EXCEL_ODBC.xlsx`.`JOIN対象テーブル1$` `A`,
`%USERPROFILE%\Desktop\EXCEL_ODBC2.xlsx`.`Sheet1$` `B` WHERE
`A`.PRODUCTION_ID = `B`.PRODUCTION_ID