【Excel】CSVファイルを開く

  • ダブルクリック
    ダブルクリックで開いた場合、数値などは自動判断する。
  • テキストファイルで読み取り
    ツールバーの「データ」-「外部データの取り込み」-「テキストファイル」から読み取り、
    区切り文字をカンマに指定し、全項目を文字列として読み取る。
    数値も文字列として読み取るので、先頭が0でも変換しない。
    項目間が”,”の場合、ダブルクォート内のカンマは区切り文字ではなく、
    文字としてのカンマとして扱う。

【Oracle】1ヵ月間の範囲に含まれるにデータの抽出

業務では適用開始年月日(VALID_START_YMD)と
適用終了年月日(VALID_END_YMD)を持つテーブルが多いですが、
そこから指定の1ヵ月間の範囲に含まれるデータを抽出します。

WHERE VALID_START_YMD <= '月末' AND VALID_END_YMD >= '月初'
適用開始年月日にあてるのが「月末」
適用終了年月日にあてるのが「月初」

逆にしてしまうと1ヶ月間のうち、月初~15日、16日~月末のような
2レコードがある場合、取得できなくなります。

【bat】フォルダの末尾に日付を追加してバックアップ

作業フォルダの末尾に日付を追加してバックアップします。
設計や開発時にファイルサーバーや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を使うとコピー除外もできる

【JScript】ファイル一覧とディレクトリ一覧

サブディレクトリ内は再帰しません。

// パスを指定する。
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("ディレクトリではありません。");
    }
}

【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する

保守開発において改修前後で比較することが多いですが、
ファイル内に自動で更新日時が入るようなファイルが大量にある場合、
更新日時をある一定の文字に置換し、改修前後で比較可能にします。

対象の大量ファイルは「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;

【JScript】スクリプトの実行

Windows上でJScriptを実行するには
コマンドプロントから実行するのが便利です。

CScript ファイル名

CScript.exeは「C:/Windows/System32」と「C:/Windows/SysWOW64」に存在しています。
環境変数の設定によりどちらかが優位性が高い設定になっています。

【サクラエディタ】マクロのショートカット登録

サクラエディタのマクロをショートカットに登録します。

  • マクロの登録
    マクロを作成後、ツールバーの「設定」-「共通設定」を選択し、「マクロ」タブを開きます。
    「マクロ一覧」にマクロの保存先ディレクトリを指定します。
    任意の番号を選択し、行をアクティブにします。
    「名前」に任意の分かりやすい名前を設定します。
    「File」に保存したマクロを選択します。
    「設定」ボタンを押下します。
    ここの「設定」ボタンを押下しないと反映されないので注意です。
  • ショートカットに登録
    「キー割り当て」タブを開きます。
    「種別」に「外部マクロ」を選択します。
    登録したマクロを選択し、キーの割り当てを選択し、「割付」ボタンを押下します。
    これでサクラエディタ上で割り当てたキーを押下すると登録したマクロが動作します。

【サクラエディタ】日付の置換マクロ(JScript版)

サクラエディタの日付を決まった値に置換。(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)