質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

1回答

2984閲覧

バッチファイルでの文字列の置換処理を高速にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2020/06/06 01:03

編集2022/01/12 10:55

前提・実現したいこと

バッチファイルにて、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行ごとに処理する部分は変わりないので、あまり差は出ませんでした。
申し訳ありませんが、諸事情により、フリーのソフトなどはできるだけ使いたくない状況です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ヘディングのテキスト> ...出力されるCSVファイルのサイズが非常に大きく、文字列置換処理でかなり時間がかかってしまっている...

何件のデータで、どんな置換をやっていて、どのくらいの時間がかかっている、といった情報が提示されていた適切なコメントが付きそうです。

通常、Database Server はそれなりに高性能のハードウェアを用意するはずなので、とりあえず、SELECT時にREPLACE命令で置換した結果をCSVにしてみては?

追記

SQL

1SQL> SELECT REPLACE('"XXX"', '"XXX"', 'XXX') AS REPLACED FROM DUAL; 2 3REPLAC 4------ 5XXX

投稿2020/06/06 01:54

編集2020/06/06 02:26
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/06 02:02

ありがとうございます。前後してしまったかもしれませんが、具体的な置換処理を記載しました。 データ件数としては100万~200万レコードであり、現状でかかっている時間は2時間半~3時間になります。 (SQLの実行自体は5分程度になります)
Orlofsky

2020/06/06 02:28

回答を追記しました。 最初の回答でSQL言語リファレンスでREPLACEの使い方くらい自分で調べられると思っていたのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問