実現したいこと
Oracleデータベースの宛名テーブルデータをCSVに出力させる機能です。
Trim_ATENA.csvに一度出力させてから、powershellで空白詰めとダブルクォーテーション囲みをして編集したデータをTcat_ATENA.csvに出力をして、Trim_ATENA.csvを削除するプログラムです。
発生している問題・分からないこと
出力する宛名が「山田,太郎」というようにカンマが含まれていると、現状のpowershellだとCSVには「"山田",”太郎”」と出力されてしまいます。CSVファイルに「"山田,太郎"」と出力させるには、どの部分を改良すればいいのかを教えていただきたいです。
該当のソースコード
atena.bat
1@echo off 2chcp 65001 > nul 3set NLS_LANG=.AL32UTF8 4setlocal 5 6:: Oracle接続情報 7set HOST=** 8set PORT=**** 9set SERVICE=** 10 11set USER=*** 12set PASS=*** 13 14 15rem batファイルのあるディレクトリを取得 16 17set "BASEDIR=%~dp0" 18 19 20rem CSVファイルの出力先を設定 21 22set "CSVDIR=**" 23 24 25rem logファイルの出力先を設定 26 27set "LOGDIR=**" 28 29 30rem 日付付きログファイルを作成 31for /f "tokens=1-3 delims=/- " %%a in ("%date%") do ( 32 set "YYYY=%%a" 33 set "MM=%%b" 34 set "DD=%%c" 35) 36 37set "LOGDATE=%YYYY%%MM%%DD%" 38set "LOGFILE=%LOGDIR%\export_%LOGDATE%.log" 39 40 41rem sqlファイル 42set "EXPORT_SQL=%BASEDIR%sql\atena.sql" 43 44rem CSVファイルの名前を宣言 45set "inputatena=%CSVDIR%\trim_ATENA.csv" 46set "outputatena=%CSVDIR%\TCat_ATENA.csv" 47 48 49echo [%DATE% %TIME%] CSVファイルの出力処理開始 >> "%LOGFILE%" 50 51 52sqlplus -S %USER%/%PASS%@%HOST% @%EXPORT_SQL% "%CSVDIR%" >> "%LOGFILE%" 2>&1 53 54 55rem 連携用CSVの出力 0件の場合でもCSVが出力される 56powershell -NoProfile -Command ^ 57 "Get-Content '%inputatena%' -Encoding UTF8 | ForEach-Object { $fields = $_ -split ','; $processedFields = $fields | ForEach-Object { '\"' + $_.Trim() + '\"' }; $processedFields -join ',' } | Out-File -FilePath '%outputatena%' -Encoding UTF8" >> "%LOGFILE%" 2>&1 58 59 60rem 連携用CSVの出力件数をログファイルに記述 61powershell -NoProfile -Command ^ 62 "$count = (Get-Content '%CSVDIR%\TCat_ATENA.csv' -Encoding UTF8).Count; 'TCAT_ATENA.csv出力件数: ' + $count | Out-File -FilePath '%LOGFILE%' -Encoding UTF8 -Append" 63 64 65echo 連携用CSVの出力を完了しました 66 67echo [%DATE% %TIME%] 連携用CSVの出力を完了しました >> "%LOGFILE%" 68 69rem 整列用CSVの削除 70del "%inputatena%" 71 72 73pause 74endlocal 75exit /b 76
sqlファイル
1DEFINE CSVDIR = '&1' 2 3SET ECHO OFF 4SET FEEDBACK OFF 5SET HEADING OFF 6SET LINESIZE 13000 7SET PAGESIZE 0 8SET TRIMSPOOL ON 9SET TERMOUT OFF 10SET WRAP OFF 11SET COLSEP ',' 12 13 14SPOOL &CSVDIR/trim_ATENA.csv 15SELECT * FROM tcat_atena_DUMMY WHERE YUKOFLAG = 1; 16SPOOL OFF 17 18EXIT;
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
powershellの内容を何度か変更してみましたが、どうもうまくいきません。
皆さんの知恵をお借りしたいです。
補足
全てのデータ項目をダブルクォーテーションで囲んでカンマで区切るようになっています。
データがnullだった場合は""が出力されています。
回答2件
あなたの回答
tips
プレビュー