業務では適用開始年月日(VALID_START_YMD)と
適用終了年月日(VALID_END_YMD)を持つテーブルが多いですが、
そこから指定の1ヵ月間の範囲に含まれるデータを抽出します。
WHERE VALID_START_YMD <= '月末' AND VALID_END_YMD >= '月初'
適用開始年月日にあてるのが「月末」 適用終了年月日にあてるのが「月初」
逆にしてしまうと1ヶ月間のうち、月初~15日、16日~月末のような
2レコードがある場合、取得できなくなります。
業務では適用開始年月日(VALID_START_YMD)と
適用終了年月日(VALID_END_YMD)を持つテーブルが多いですが、
そこから指定の1ヵ月間の範囲に含まれるデータを抽出します。
WHERE VALID_START_YMD <= '月末' AND VALID_END_YMD >= '月初'
適用開始年月日にあてるのが「月末」 適用終了年月日にあてるのが「月初」
逆にしてしまうと1ヶ月間のうち、月初~15日、16日~月末のような
2レコードがある場合、取得できなくなります。
作業フォルダの末尾に日付を追加してバックアップします。
設計や開発時にファイルサーバーやSVNサーバが使えない場合、
日々のバックアップで利用しました。
@ECHO OFF REM コピーします。 SET DIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2% SET DIR_FULL_NAME=D:\test_%DIR_NAME% REM ディレクトリを作成する。実行結果をNULに流し、標準エラー出力および標準出力とする。 MKDIR %DIR_FULL_NAME% > NUL 2>&1 XCOPY /Y /D /E C:\Users\ユーザ名\Desktop\test %DIR_FULL_NAME% REM /Y:同名のファイルが存在する場合、上書きの確認を行わない REM /D:コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする REM /E:ファイルが存在しなくてもディレクトリごとコピーする REM /EXCLUDE:file nameを使うとコピー除外もできる
サブディレクトリ内は再帰しません。
// パスを指定する。
var target = "D:/Book/";
// ファイル一覧とディレクトリ一覧を取得する。
enumFiles(target);
function enumFiles(target) {
// ファイルを扱う準備を行う。
var fso = new ActiveXObject("Scripting.FileSystemObject");
// FileExistsの第1引数がファイルの場合
if (fso.FileExists(target) == true) {
WScript.Echo("ファイルです。");
}
// FileExistsの第1引数がファイル以外の場合
if (fso.FileExists(target) == false) {
WScript.Echo("ファイルではありません。");
}
// FolderExistsの第1引数がディレクトリの場合
if (fso.FolderExists(target) == true) {
WScript.Echo("ディレクトリです。");
// ディレクトリ内の一覧を取得する。
var all = fso.GetFolder(target);
// ディレクトリ内の一覧からファイルを取得する。
var eFile = new Enumerator(all.Files);
for ( ; !eFile.atEnd(); eFile.moveNext()) {
var file = eFile.item();
WScript.Echo(file.Path);
}
// ディレクトリ内の一覧からサブディレクトリを取得する。
var eDir = new Enumerator(all.SubFolders);
for ( ; !eDir.atEnd(); eDir.moveNext()) {
var dir = eDir.item();
enumFiles(dir.Path);
}
}
// FolderExistsの第1引数がディレクトリ以外の場合
if (fso.FolderExists(target) == false) {
WScript.Echo("ディレクトリではありません。");
}
}
保守開発において改修前後で比較することが多いですが、
ファイル内に自動で更新日時が入るようなファイルが大量にある場合、
更新日時をある一定の文字に置換し、改修前後で比較可能にします。
対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。
var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("C:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
var file = e.item();
var fileFullPathBefore = "C:/replaceBefore/" + file.Name;
var fileFullPathAfter = "C:/replaceAfter/" + file.Name;
WScript.Echo(fileFullPathBefore + "を処理します。");
// 入力ファイルの設定
// Typeの設定値
// 1:バイナリを表す。
// 2:既定値。charsetで指定した文字セットで文字列を表す。
var sr = new ActiveXObject("ADODB.Stream");
sr.Type = 2;
sr.charset = "utf-8";
sr.Open();
sr.LoadFromFile(fileFullPathBefore);
// 入力ファイルの読込み
// ReadTextの第1引数
// -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
// -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
var temp = sr.ReadText(-1);
// WScript.Echo(temp);
sr.Close();
sr = null;
// 出力ファイルの設定
var sw = new ActiveXObject("ADODB.Stream");
sw.Type = 2;
sw.charset = "utf-8";
sw.Open();
// 置換文字列検索用
// RegExpの第2引数に'g'を指定すると全置換になる。
var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
// var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');
// 出力ファイルの書込み
// WriteTextの第2引数
// ActiveXObjectのTypeが文字列(2)の場合に利用する。
// 0:既定値。文字列を書き込む。
// 1:文字列+改行を書き込む
sw.WriteText(temp.replace(reg, ""), 0);
// 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
// 書き込んだオブジェクトのポジションをゼロに戻し、
// バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
// この処理順序は変更不可。
if (sw.charset == "utf-8") {
sw.Position = 0;
sw.Type = 1;
sw.Position = 3;
var textBinary = sw.Read();
sw.Close();
sw.Type = 1;
sw.Open();
sw.Write(textBinary);
}
// 出力ファイルの保存
// SaveToFileの第2引数
// 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
// 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
sw.SaveToFile(fileFullPathAfter, 2);
sw.Close();
sw = null;
}
fso = null;
特定のディレクトリに移動しつつ、
コマンドプロントを待機状態にします。
@echo off echo 下記のコマンドを実行してください。 echo db2cmd test.bat cd C:/ cmd /k
Windows上でJScriptを実行するには
コマンドプロントから実行するのが便利です。
CScript ファイル名
CScript.exeは「C:/Windows/System32」と「C:/Windows/SysWOW64」に存在しています。
環境変数の設定によりどちらかが優位性が高い設定になっています。
サクラエディタのマクロをショートカットに登録します。
サクラエディタの日付を決まった値に置換。(JScript版)
置換後の日付はDB2のTimeStamp型に登録可能。
キーマクロの記録はできませんが、
JScript版なので演算や変数も利用可。
// 変数宣言
var FileName;
// すべて置換
// [0-9]{n}:0~9の数字をn回繰り返すの意味
Editor.ReplaceAll('[0-9]{4}-[0-9]{2}-[0-9]{2}-00[.]00[.]00[.]000000','2015-12-31-00.00.00.000000', 60)
// 再描画
Editor.ReDraw(0)
// すべて選択
Editor.SelectAll(0)
// 選択行の昇順ソート
Editor.SortAsc(0)
// ファイル名をフルパスで取得
FileName = GetFilename();
// ファイル名を変更
FileName = FileName.replace(".txt", "_比較用.txt");
// ファイルを保存
// 第1引数:ファイル名フルパス
// 第2引数:0はSJIS保存
// 第3引数:0は改行コードは変更しない
Editor.FileSaveAs(FileName, 0, 0);
JScriptはJavaScriptとは異なります。
JScript:Microsoftが開発したJavaScript互換のスクリプト言語
JavaScript:NetscapeとSunが共同開発したスクリプト言語
昔は利権の絡みとか色々あったんでしょうが、
今は標準仕様に準拠しているようで、書き方は同一といってもいいようです。
とはいえ、JSCriptを正式にサポートしているのはMicrosoftのみであり、
Web上でFireFoxやChromeで動作させるといった場合を考えると、
通常はJavaScriptで定義した方が良いようです。
サクラエディタのマクロはJScriptになります。
サクラエディタのキーマクロで日付を決まった値に置換。
置換後の日付はDB2のTimeStamp型に登録可能。
ツールバーの「ツール」-「キーマクロの記録開始」で記録できます。
キーマクロ版なので演算や変数は利用不可。
// すべて置換
// [0-9]{n}:0~9の数字をn回繰り返すの意味
S_ReplaceAll('[0-9]{4}-[0-9]{2}-[0-9]{2}-00[.]00[.]00[.]000000','2015-12-31-00.00.00.000000', 60)
// 再描画
S_ReDraw(0)
// すべて選択
S_SelectAll(0)
// 選択行の昇順ソート
S_SortAsc(0)
Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。
Sub Test()
' 検索速度向上のポイント
' 何度も登場するブックやセルは変数に格納し、メモリを参照する。
' 画面チラつきを防止する。
' 画面チラつきを防止する。
Application.ScreenUpdating = False
' フォルダパスとファイル名を宣言する。
Dim strFilePath As String
Dim strFileNmae As String
' テキストボックスかセル入力でフォルダを指定させる。
strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
' 末尾が\ではない場合、\を追加する。(未実装)
strFilePath = strFilePath & "\"
' 指定フォルダ内のファイル名を取得する。
strFileName = Dir(strFilePath, vbNormal)
' 結果シートを変数に設定する。
Dim resultBookSheet As Worksheet
Set resultBookSheet = Worksheets("sheet1")
' 結果シートの行数を宣言する。
Dim longGyo As Long
longGyo = 1
' 指定フォルダ内のファイルがなくなるまで繰り返す。
Do While strFileName <> ""
Dim result As Range
Dim firstAddress As String
' ファイルを開く。
With Workbooks.Open(Filename:=strFilePath & strFileName)
' ファイル内のシート数を取得する。
Dim sheetCnt As Long
sheetCnt = .Worksheets.Count
' 1シート目からnシート目まで繰り返す。
Dim i As Long
For i = 1 To sheetCnt
' What:=検索するデータを指定
' After:=検索を開始するセルを指定
' LookIn:=値を検索
' LookAt:=一部が一致するセルを検索
' SearchOrder:=列単位で検索(行単位のxlByColumnsを指定しているとセル結合が検索されない)
' SearchDirection:=順方向に検索
' MatchCase:=大文字と小文字を区別しない
' MatchByte:=半角と全角を区別しない
' SearchFormat:=セル書式は検索条件に指定しない
Set result = .Worksheets(i).Cells.Find(What:="APS" _
, After:=ActiveCell _
, LookIn:=xlValues _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlNext _
, MatchCase:=False _
, MatchByte:=False _
, SearchFormat:=False)
If Not result Is Nothing Then
firstAddress = result.Address
Do
resultBookSheet.Cells(longGyo, 1).Value = strFilePath & strFileName
resultBookSheet.Cells(longGyo, 2).Value = .Worksheets(i).Name
' resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Row & ", " & result.Column & ")"
resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Address & ")"
resultBookSheet.Cells(longGyo, 4).Value = .Worksheets(i).Cells(result.Row, result.Column).Value
longGyo = longGyo + 1
Set result = .Worksheets(i).Cells.FindNext(result)
If result Is Nothing Then
Exit Do
End If
If result.Address = firstAddress Then
Exit Do
End If
Loop
End If
Next i
' 保存せずファイルを閉じる。
.Close SaveChanges:=False
End With
' 次のファイルを取得する。
strFileName = Dir()
Loop
' 画面チラつき防止を解除する。
Application.ScreenUpdating = True
End Sub