←
▼
▲
デストラクタから自動的に呼ばれますが、明示的に呼び出すこともできます。
Sub ReplaceTextFile1::Close()
テキストファイルの内容の変更を完了します。
←
▼
▲
Sub SafeFileUpdate( FromTmpFilePath as string, ToFilePath as string )
ファイルを安全に更新します。 上書き移動して、元の内容はゴミ箱に入ります。
【引数】
FromTmpFilePath
ToFilePath
新しい内容が書かれたファイルのパス
更新するファイルのパス
SafeFileUpdate を呼び出している途中で、ファイルの更新やバックアップなどに失敗
したら、エラーが発生しますが、ファイルの内容は、消えることなく、元に戻ります。
ただし、新しい内容が保存できていないので、エラー復帰して、別のディスクに保存
できるようにしてください。
(src)
テスト
→ T_SafeCopy.vbs # [T_SafeFileUpdate]
ファイル:
vbslib.vbs
サンプル
tmp_path = GetTempPath( "new_*.txt" )
CreateFile tmp_path, "新情報!"
SafeFileUpdate tmp_path, "FileA.txt"
FileA.txt の内容を、"新情報!" という内容に更新します。
一時的に存在するファイル tmp_path に、新しい内容を出力する必要があります。
SafeFileUpdate を呼び出した後は、tmp_path の場所にファイルは無くなります。
古い内容は、ごみ箱に入ります。
"FileA.txt"
"新情報!"
更新するファイルを直接開いてライトするプログラムの場合、ライトしている途中で、
容量不足になったり、接続できなくなったりしてエラーになると、更新する前の内容
が消えてしまいます。 それだけでなく、更新した後の内容も保存できない可能性が
あります。 その場合、ファイルに格納していた情報がすべて消えてしまいます。
SafeFileUpdate は、そのリスクを回避します。
関連
←
▼
▲
Sub ConvertToAbsPath( SrcFilePath as string, DstFilePath as string )
%AbsPath(..\SampleLib)%
テキストファイルの中の相対パスや特殊フォルダのパスを絶対パスに変換してコピーします。
変換前
変換後の例
C:\folder\SampleLib
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
【引数】
SrcFilePath
DstFilePath
変換前のファイルのパス
変換後のファイルのパス(新規作成または上書き)
(src)
%AbsPath(x)% の x に相対パスを記述すると、DstFilePath のファイルが入ったフォルダを相対
パスの基準にした絶対パスに変換されます。 基準を SrcFilePath ではなく DstFilePath にして
いる理由は、1つの SrcFilePath のファイルに対して、複数の場所で使用することができるよう
にするためです。
% を使った環境変数も展開されます。
→ TextFileConvertFormat::Set_
参考
テスト
Unicode ファイルにするときは、次のように設定してから ConvertToAbsPath を呼んでください。
Dim c : Set c = g_VBS_Lib
Dim cs : Set cs = new_TextFileCharSetStack( c.Unicode )
ConvertToAbsPath "ans.txt", "ans_tmp.txt"
%AbsPath(.)%
C:\folder\current
→ T_ConvAbs.vbs # ConvertToAbsPath
参考
←
▼
▲
Dim rep, line, cr_lf
Set rep = StartReplace( "a.txt", GetTempPath("*.txt"), False )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf
line = Replace( line, "Value=0", "Value=1" )
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
(src)
Function StartReplace( SrcPath as string, TmpDstPath as string, IsDstWillBeExist as boolean )
as StartReplaceObj
ファイルの一部を置き換える準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
IsDstWillBeExist
StartReplace を呼び出すと、SrcPath と TmpDstPath のファイルを開きます。
返り値を使って、ファイルにアクセスできます。(下記サンプルを参照)
返り値
コンテキスト
関連
→ T_Replace.vbs # [T_StartReplace]
テスト
改行文字コードは、SrcPath に記述されているものが、そのまま継承されます。 ただし、
が使える環境である必要があります。
また、rep.r 以外のファイルから rep.w にライトするときは、リードするファイルを開くときに、
new_TextFileLineSeparatorStack( get_ADODBConsts().Keep ) が必要です。
改行文字コードについて
ReadLine で取得できる行の末尾には、vbCR や vbLF が付きます。
その他のサンプル
IsDstWillBeExist に g_VBS_Lib.DstIsBackUp を指定すると、TmpDstPath にバックアップを作成し、
SrcPath 置き換えた後の内容が入ります。
IsDstWillBeExist = False のときは、返り値の Finish メソッドを呼び出すと、全てのファイルを閉じ、
TmpDstPath から SrcPath へ、ファイルコピーを行い、TmpDstPath を削除します。
を使って分けることができます。
←
▼
▲
テキストファイルの一部を置き換えるインターフェース
取得
置き換えようとするファイルのストリーム
一時ファイル、または置き換えた後のファイルのストリーム
Finish
正常に完了したら呼び出す必要がある関数
Class_Terminate
デストラクタ。 Finish または ExitFinish が呼ばれなかったら警告します
ExitFinish Empty
置き換えをキャンセルします。
←
▼
▲
Sub ReplaceTextFile( SrcPath as string, TmpDstPath as string,
bDstWillBeExist as boolean, ReplaceList as ReplaceItem, Opt as variant )
ファイルの一部を置き換えます。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパス=True, 一時パス=False
bDstWillBeExist
ReplaceList
置き換えるテキスト
Opt
Empty を指定してください
Dim reps : new_ReplaceItem_array reps, 1
reps(0).Src = "%base%" : reps(0).Dst = g_sh.CurrentDirectory
ReplaceTextFile "file.txt", GetTempPath("*.txt"), False, reps, Empty
サンプル:
(src)
1
new_ReplaceItem_array については、
Class ReplaceItem
Public Src
Public Dst
End Class
%base%
g_sh.CurrentDirectory
file.txt
→ TextFileConvertFormat::Set_
参考
ver4 で、廃止になりました。 OpenForReplace を使ってください。
←
▼
▲
Sub Main( Opt, AppKey )
Dim c : Set c = g_VBS_Lib
Dim path : path = InputPath( "変換するファイル >", c.CheckFileExists or c.UseArgument1 )
Dim w_:Set w_=AppKey.NewWritable( path ).Enable()
Dim rep, line, cr_lf
Set rep = StartReplace( path, GetTempPath("Replace_*.txt"), c.DstIsBackUp )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf
line = "> "+ line
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
start GetEditorCmdLine( path )
End Sub
スクリプト・ファイルに処理をするファイルを直接ドラッグ&ドロップしても、スクリプト・ファイルをダブル・
クリックして開いたウィンドウに処理するファイルをドラッグ&ドロップしても処理ができます。
「line = "> "+ line」 の部分を処理内容に書き換えてお使いください。
←
▼
▲
Sub main2( Opt, AppKey )
Dim exe_name
Dim desktop : desktop = g_sh.SpecialFolders( "Desktop" )
Dim rep, line
Dim w_:Set w_=AppKey.NewWritable( desktop ).Enable()
'//=== Input exe name
Do
exe_name = input( "exe name>" )
If exist( desktop + "\" + exe_name ) Then
Raise 1, "すでにデスクトップに " + exe_name + " が存在するため、新規作成できません"
Else
Exit Do
End If
Loop
'//=== Make output folder
mkdir desktop + "\" + exe_name
copy g_vbslib_folder + "*", desktop + "\" + exe_name + "\scriptlib"
'//=== Make exe_name.c
Set rep = StartReplace( "files\template.c", _
desktop + "\" + exe_name + "\" + exe_name + ".c", True )
Do Until rep.r.AtEndOfStream
line = rep.r.ReadLine()
line = Replace( line, "Sample", exe_name )
rep.w.WriteLine line
Loop
rep.Finish
'//=== Open output folder
Setting_openFolder desktop + "\" + exe_name
End Sub
sample_wizard.vbs
wizard
sample_wizard.vbs
files
template.c
デスクトップに、テンプレート・ファイルを少し加工してフォルダを作成します。
exe name>
と表示されるので、入力すると、
_src\Test\vbslib_test\T_Replace\T_Replace_Sample1 にあります。
←
▼
▲
Function StartReplace2( SrcPath as string, MidPath as string, Flags as integer,
TmpDstPath as string, bDstWillBeExist as boolean ) as StartReplaceObj
F_Txt2BinTxt を指定してください(下記)
ファイルの一部を置き換えて、更にフィルタ処理をするための準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
bDstWillBeExist
返り値
コンテキスト
MidPath
Flags
一時ファイルのパス
StartReplaceObj.w に、Chr(&hFF) から始める行を出力すると、その行はバイナリになり
ます。
→ TextFileConvertFormat::Set_
参考
←
▼
▲
Sub PassThroughLineFilters( SrcPath as string, TmpDstPath as string,
IsDstWillBeExist as boolean, Opt as Empty, FilterArray as array of string )
指定のキーワードを含む行を抽出します。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
IsDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
キーワードの配列
Empty または False (=FilterArray に含まない行を抽出)
FilterArray
Opt
(src)
PassThroughLineFilters( "a.txt", GetTempPath("*.txt"), False, Empty, _
Array( "(TRACE)", "(DEBUG)" )
(TRACE) と (DEBUG) を含む行だけにします。
→ T_Replace.vbs # [T_PassThroughLineFilters]
テスト
関連
←
▼
▲
Sub SplitLineAndCRLF( LineAndCRLF as string, out_Line as string, out_CRLF as string )
行の本文と、行末の改行文字を分けます。
【引数】
LineAndCRLF
out_Line
改行文字が末尾に含まれている可能性がある文字列
(出力) 改行文字より前の文字列
ファイル:
vbslib
out_CRLF
(出力) 行末の改行文字
(src)
←
▼
▲
Function CutCRLF( Line as string )
改行文字を削除します。
【引数】
Line
返り値
改行文字が削除される文字列
改行文字が削除された文字列
ファイル:
vbslib
(src)
→ T_Replace.vbs # [T_CutCRLF]
テスト
←
▼
▲
Sub Translate( TranslatorPath as string, FromLanguage as string, ToLanguage as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳します。
【引数】
TranslatorPath
FromLanguage
翻訳ファイル(*.trans)のパス
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
(src)
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>sample1.txt</File>
<File>sample2.c</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP><EN>English</EN></T>
</Translate>
<?xml version="1.0" encoding="UTF-16"?>
<Translate>
<File>sample.txt</File>
<T><JP>日本語</JP><EN>Japanese</EN></T>
<T><JP>英語</JP><EN>English</EN></T>
</Translate>
サンプル
sample.trans (翻訳ファイル)
sample.txt の翻訳前
日本語から英語に変換します。
sample.txt の翻訳後
JapaneseからEnglishに変換します。
サンプル : 複数のファイルを翻訳する
JapaneseToEnglish.trans (翻訳ファイル)
スクリプト
Translate "sample.trans", "JP", "EN"
スクリプト
Translate "JapaneseToEnglish.trans", "EN", "JP"
英語 から 日本語 へ
sample1.txt の翻訳後
English から Japanese へ
sample1.txt の翻訳前
sample2.c の翻訳前
sample2.c の翻訳後
French から 日本語 へ
French から Japanese へ
File タグに指定したファイルを翻訳します。
→ T_Translate.vbs # [T_Translate1]
→ T_Translate.vbs # [T_Translate_sth]
テスト
英語に翻訳するときに、英文字以外が残っていたときは、エラーが発生します。
関連
←
▼
▲
Sub TranslateTest( TranslatorPath as string, FromLanguage as string, ToLanguage as string,
OutFolderPath as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳できるかどうかチェックします。
【引数】
TranslatorPath
FromLanguage
翻訳ファイルのパス
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
OutFolderPath
翻訳後の出力先ファイル・パス。 または "" = 出力しない
(src)
参考
関連
→ T_Translate.vbs # [T_TranslateTest]
テスト
→ T_Translate.vbs # [T_TranslateTest_sth]
←
▼
▲
Function CheckEnglishOnly( CheckFolderPath as string, SettingPath as string )
as ArrayClass<CheckEnglishOnlyFound>
テキスト・ファイルの中に、英文字以外の文字が含まれるファイルを一覧します。
【引数】
CheckFolderPath
SettingPath
調べるフォルダのパス
設定ファイルのパス。または Empty。 設定ファイル
ToolsLib.vbs
モジュール・ファイル:
返り値
英文字以外の文字が含まれるファイルの情報
(src)
Dim founds, found, file
Set founds = CheckEnglishOnly( "FolderA", "SettingForCheckEnglish.ini" )
For Each file In founds.Items
For Each found In file.NotEnglishItems.Items
echo file.Path +"("& found.LineNum &"): "+ found.NotEnglishText
Next
Next
サンプル:
テスト
実行ファイル版
関連
簡易版
サンプル: scriptlib フォルダーをチェックする
→ 3.CheckNotEnglish フォルダー
→ T_CheckEnglishOnly.vbs # [T_CheckEnglishOnly]
←
▼
▲
Function new_TranslateToEnglish( DictionaryCsvPath as string ) as TranslateToEnglish
辞書ファイルを使って、ソース・ファイルのコメントを英訳します。
【引数】
DictionaryCsvPath
CSV 形式の辞書ファイルのパス
ToolsLib.vbs
モジュール・ファイル:
(src)
サンプル:
Dim tr : Set tr = new_TranslateToEnglish( "Text1.txt.trans.csv" )
'// tr.IsReverseTranslate = True
Dim w_:Set w_=AppKey.NewWritable( tr.Writable ).Enable()
tr.Translate
いわゆる英訳ソフトのような、文法解析を行って大きな辞書を引くような翻訳ではありません。
内部では、単純なテキストの置換と、置換後のファイルに含まれる文字が英文字だけかどうか
のチェックをします。 翻訳後に英文字以外の文字が残ったら、TranslateToEnglish::c.
E_NotEnglishChar エラーになります。
英訳処理のサンプル
Text1_trans.csv
Text1.c, %eng%\Text1.c
メイン関数, Main function
サブ関数, Sub function
テスト
#include <stdio.h>
int main() { } // メイン関数
int sub() { } // サブ関数
Text1.c
%eng%\Text1.c
#include <stdio.h>
int main() { } // Main function
int sub() { } // Sub function
1行目の左は、変換前のファイルパスです。
1行目の右は、変換後のファイルパスです。
1行目は、% % で囲んだ環境変数を指定できます。
1行目の右を省略すると、ファイルの置き換えをします。
2行目以降は、翻訳するキーワードを指定します。
→ TranslateToEnglish フォルダ
キーワード:
関連
→ sample / CheckEnglishOnly
関連
英文字以外が無いか、フォルダ全体をチェックする
Text1.txt.trans.csv
廃止
←
▼
▲
.IsReverseTranslate
Property TranslateToEnglish::IsReverseTranslate as boolean
.Writable
Property TranslateToEnglish::Writable as string
.Translate
Sub TranslateToEnglish::Translate()
取得
True なら、翻訳する方向を逆に設定します。
EnglishTextPath から NotEnglishTextPath に翻訳します。
デフォルトは False です。
出力ファイルのパス。
AppKey.NewWritable に指定してください。
翻訳を実行します。
Property TranslateToEnglish::c.E_NotEnglishChar as integer
翻訳後も英文字以外の文字が残っていたときのエラーコード。
.Reverse が呼び出されたときは、このエラーは発生しません。
.NotEnglishTextPath
.EnglishTextPath
Property TranslateToEnglish::EnglishTextPath as string
英語のテキスト・ファイルのパス。
NotEnglishTextPath と同じパスを指定できます。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
英語以外のテキスト・ファイルのパス。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
Property TranslateToEnglish::NotEnglishTextPath as string
.DictionaryCsvPath
Property TranslateToEnglish::DictionaryCsvPath as string
CSV 形式の辞書ファイルのパス。
new_TranslateToEnglish に指定した引数の値と同じです。
廃止
←
▼
▲
cd g_fs.GetParentFolderName( WScript.ScriptFullName )
Dim trs, tr, folder, fnames(), fname, w_, step_path, b
set_ "folder_jp", "C:\FolderA"
set_ "folder_en", GetAbsPath( "..\folder_en", WScript.ScriptFullName )
echo_line
echo "コメントを英訳します"
echo "From: "+ GetVar( "folder_jp" )
echo "To: "+ GetVar( "folder_en" )
pause
'//=== 翻訳 CSV ファイルを集める
Set trs = new ArrayClass
ExpandWildcard GetVar( "folder_en" ) +"\*.trans.csv", F_File or F_SubFolder, folder, fnames
For Each fname in fnames
step_path = fname : CutLastOf step_path, ".trans.csv", Empty
set_ "step", step_path
trs.Add new_TranslateToEnglish( folder +"\"+ fname )
Next
'//=== 翻訳する。 ただし、翻訳済みファイルがあるとき(英文字以外が無く、新しいとき)は処理しない
For Each tr In trs.Items
b = MakeRule_compare( tr.EnglishTextPath, tr.NotEnglishTextPath )
If not b Then b = ( GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty ) > 0 )
If b Then
Set w_=AppKey.NewWritable( tr.Writable ).Enable()
tr.Translate
End If
Next
%folder_jp%\%step%, %folder_en%\%step%
日本語, Japanese
翻訳ファイル *.trans.csv を、変換対象のフォルダーと同じ構成で配置して、翻訳します。
翻訳ファイル *.trans.csv
廃止
←
▼
▲
Function GetLineNumsExistNotEnglighChar( Path as string, out_LineNums as Array of integer ) as integer
テキスト・ファイルの中に、英文字以外の文字が含まれる行番号の配列を取得します。
【引数】
Path
out_LineNums
テキスト・ファイルのパス
(出力) 英文字以外の文字が含まれる行番号の配列、Empty 指定可
ToolsLib.vbs
モジュール・ファイル:
関連
(src)
返り値
英文字以外の文字が含まれる行数
サンプル:
Dim tr : Set tr = new_TranslateToEnglish( "Text1.txt.trans.csv" )
echo GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty )
Dim i, line_nums
GetLineNumsExistNotEnglighChar "Text1.txt", line_nums '//[out] line_nums
For Each i In line_nums
echo i
Next
日本語(文字コード256以上)を 2文字として文字数を返します。