質問: ### 前提・実現したいこと バッチファイルにて、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行ごとに処理する部分は変わりないので、あまり差は出ませんでした。 申し訳ありませんが、諸事情により、フリーのソフトなどはできるだけ使いたくない状況です。 よろしくお願いいたします。
回答: ### ヘディングのテキスト> ...出力されるCSVファイルのサイズが非常に大きく、文字列置換処理でかなり時間がかかってしまっている... 何件のデータで、どんな置換をやっていて、どのくらいの時間がかかっている、といった情報が提示されていた適切なコメントが付きそうです。 通常、Database Server はそれなりに高性能のハードウェアを用意するはずなので、とりあえず、SELECT時にREPLACE命令で置換した結果をCSVにしてみては? 追記 ``` SQL> SELECT REPLACE('"XXX"', '"XXX"', 'XXX') AS REPLACED FROM DUAL; REPLACXXX ```