前提・実現したいこと
バッチファイルにて、SQLPLUSを実行しCSVファイルを作成。その後、作成したCSVファイル内の特定の文字列を置換する、という処理を実現させたいと考えています。
置換処理は、「特定の値を持つのカラムのみ囲み文字を削る」というものです。
CSVファイル出力直後・置換前
"CODE","NAME","AGE","SEX","OTHER"
"0001","太郎",20,"male","XXX"
"0002","花子",21,"female","XXX"
"0003","一郎",22,"male","YYY"
上記のうち、"XXX"をXXXに置換
置換後
"CODE","NAME","AGE","SEX","OTHER"
"0001","太郎",20,"male",XXX
"0002","花子",21,"female",XXX
"0003","一郎",22,"male","YYY"
発生している問題・エラーメッセージ
下記のソースコードで処理自体は実現できているのですが、出力されるCSVファイルのサイズが非常に大きく、文字列置換処理でかなり時間がかかってしまっているので、それを解消したいのです。
置換処理は「特定の値を持つのカラムのみ囲み文字を削る」というものであるため、SQLのREPLACEなどでも対応できません。また、「特定の値」はカラムが限定できません。
該当のソースコード
@echo off @setlocal enabledelayedexpansion rem 実行したバッチファイルと同フォルダにある*.sqlファイルを順次処理 for /F %%a in ('dir *.sql /B') do (set sql_filename=%%a&& call :execute_sql) rem 出力したCSVファイルを順次処理 for /F %%a in ('dir *.csv /B') do (set fname=%%a&& call :tmp_csv) rem 処理終了 goto end rem sql実行 :execute_sql rem 作成するCSVファイル名 set CSV_FILE_PATH=%sql_filename:~0,-4%.csv sqlplus -s -m "csv on" ORAUSER/ORAPASS@ORAHOST/ORASERVICE %sql_filename% !CSV_FILE_PATH! goto :EOF rem CSVワークファイル作成 :tmp_csv rem ワークファイル作成 copy %fname% tmp_csvfile >nul type nul >%fname% rem 1行ごとに置換 for /f "delims=" %%a in ( tmp_csvfile ) do (set line=%%a&& call :replace_str) del /f tmp_csvfile goto :EOF rem 置換 :replace_str rem CSVファイル内の"AAA"という文字列をAAAに変換 set l=%line:"AAA"=AAA% >>%fname% echo %l% goto :EOF :end
試したこと
置換処理部分を別のバッチファイルにしてみましたが、結局1行ごとに処理する部分は変わりないので、あまり差は出ませんでした。
申し訳ありませんが、諸事情により、フリーのソフトなどはできるだけ使いたくない状況です。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/06 02:02
2020/06/06 02:28