teratail header banner
teratail header banner
質問するログイン新規登録
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

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

Q&A

解決済

2回答

258閲覧

batファイルで出力したデータを整列する機能

tefutefute-fu

総合スコア3

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

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

0グッド

0クリップ

投稿2025/06/26 06:58

編集2025/06/26 07:22

0

0

実現したいこと

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だった場合は""が出力されています。

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

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

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

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

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

attercop

2025/06/27 06:44

COLSEPにカンマではなく、検索結果に含まれない文字を指定してはどうでしょうか。
guest

回答2

0

自己解決

とりあえず、コメントで頂いた検索結果に含まれない文字指定をしてみます。
kenjiro_n様のコードは、また時間のあるときに試させていただこうと思います。
回答をくださりありがとうございました。

投稿2025/07/02 00:04

tefutefute-fu

総合スコア3

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

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

0

PowerShellからOracle DBが使えるかどうかは環境によるのであくまで参考ですが、
PowerShell 5.1が使えるのならいっそのことバッチファイルとSQLで分担している操作を内部で一気にやってしまうという手もあります。

質問で出力しているCSVファイルにはヘッダがないので Export-CSV が使えない
(正確には -NoHeader というオプションがあるのですが、これを使うためには別途 ヴァージョン 7 をインストールする必要があるので今回は除外しています )
ので下記ソースではコメントにあるとおり while($Reader.Read()) 内でCSVの行を組み立てた上で "",, に置き換える処理を行い、これをテキストファイルとして出力しています。

Powershell:atena.ps1

1using namespace System.Data.OracleClient 2Add-Type -AssemblyName System.Data.OracleClient 3 4$DBUSER = "***" 5$DBPASS = "***" 6$DBHOST = "***" 7 8$BASEDIR = Split-Path $MyInvocation.MyCommand.path -Parent 9 10$CSVDIR="***" 11 12$LOGDIR="***" 13 14$dtNow = [datetime]::Now 15$LOGDATE = $dtNow.ToString("yyyyMMdd") 16$LOGFILE = Join-Path $LOGDIR ("export_{0}.log" -f $LOGDATE) 17 18# DBへの接続を行う 19$Conn = [OracleConnection]::new("Data Source=${DBHOST};User ID=${DBUSER};Password=${DBPASS};Integrated Security=false;") 20$Conn.Open() 21 22$inputatena = Join-Path $CSVDir "trim_ATENA.csv" 23$outputatena = Join-Path $CSVDir "TCat_ATENA.csv" 24 25$strSql = @" 26SELECT * FROM tcat_atena_DUMMY WHERE YUKOFLAG = 1 27"@ 28 29$Cmd = [OracleCommand]::new() | %{ 30 $_.Connection = $Conn 31 $_.CommandText = $strSql 32 $_ 33} 34 35$Reader = $Cmd.ExecuteReader() 36$results = @() 37while($Reader.Read()) 38{ 39 # !!!カラム名とデータ型は実際のものに合わせてください 40 $line = "{0},`"{1}`",{2}" -f $Reader["ID"], $Reader["NAMAE"], $Reader["YUKOFLAG"] 41 $line = $line.Replace("`"`",", ",") 42 $results += @($line) 43} 44("[{0} {1}] CSVファイルの出力処理開始" -f $dtNow.ToString("yyyy/MM/dd"), $dtNow.ToString("HH:mm:ss")) | Out-File -FilePath $LOGFILE -Encoding UTF8 -Append 45$results | Out-File -Encoding UTF8 -FilePath $inputatena 46 47# 連携用CSVにする必要もないのでファイルコピーで済ませる 48Copy-Item $inputatena -Destination $outputatena 49 50# 連携用CSVの出力件数をログファイルに記述 51$count = $results.Count # (Get-Content $inputatena -Encoding UTF8).Count 52('TCAT_ATENA.csv出力件数: {0}' -f $count) | Out-File -FilePath $LOGFILE -Encoding UTF8 -Append 53 54 55"連携用CSVの出力を完了しました" | Write-Host 56 57$dtNow = [datetime]::Now 58("[{0} {1}] 連携用CSVの出力を完了しました" -f $dtNow.ToString("yyyy/MM/dd"), $dtNow.ToString("HH:mm:ss")) | Out-File -FilePath $LOGFILE -Encoding UTF8 -Append 59 60# 後処理 61$Reader.Dispose() 62$Cmd.Dispose() 63$Conn.Dispose() 64 65# 整列用CSVの削除 66Remove-Item -Path $inputatena

バッチファイルは単に PowerShellの起動を行うだけにします。
PowerShellのスクリプトを起動するために同一のファイル名にしておけば内容はコピペでいける上、本当はだめなんでしょうけどPowerShellスクリプトの署名を端折れるので自分はこのバッチファイルを常用しています。

batch:atena.bat

1@echo off 2REM PowerShellプログラムを起動するバッチ。 3powershell -executionpolicy RemoteSigned -File "%~dp0%~n0.ps1"

投稿2025/07/01 14:39

kenjiro_n

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問