VBSによるファイル処理方法と文字コードの問題解決の方法

このQ&Aのポイント
  • VBS超初心者の方が、VBSを使ってテキストファイルの処理をする方法と、文字コードの問題を解決する方法を教えてください。
  • VBSでテキストファイルをドラッグ&ドロップして、連続した改行を特定の文字列に置換するスクリプトを作成しました。しかし、ドイツ語のファイルを処理すると文字化けしてしまいます。UTF-8のまま処理する方法を教えてください。
  • VBSのスクリプト記述についても改善点があるか教えてください。初心者なのでお手柔らかにお願いします。
回答を見る
  • ベストアンサー

VBS/ドラッグ&ドロップ/UTF-8

VBS超初心者です。 VBSにテキストファイルをドラッグ&ドロップして、改行が3回以上連続した箇所を「改行+ダミー文字+改行」に置換するスクリプトを作成してみました。 WEB上のサンプルスクリプトなどを参考にしながら、なんとか動くようにすることはできたのですが、ドイツ語のファイルを処理すると、何故か文字コードがS-JISになって文字化けしてしまいます。 どうしたらUTF-8のまましょりできるのでしょうか。 また、スクリプトの記述もかなり拙いものになっていると思います。 問題点、完全方法などご教授いただけると今後の勉強に役立つと思うので、よろしくお願いします。 Set FS = CreateObject("Scripting.FileSystemObject") For Each strArgument in Wscript.Arguments Set ts=Fs.OpenTextFile(strArgument,1,True,TristateTrue) myStr=ts.ReadAll Set objRE = New RegExp objRE.Pattern = "(" & vbCrLf & "){3,}" repStr = vbCrLf & "[dummy]" & vbCrLf objRE.IgnoreCase = True objRE.Global = True objRE.Multiline = True newStr = objRE.Replace(myStr,repStr) ts.Close Set ts = FS.OpenTextFile(strArgument,2,True,TristateTrue) ts.Write newStr ts.Close

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

う~む、「超初心者」だったんですね。 応用例を記載したので、そのまま書くとダメなんですよ。 以下は丸々のプログラムです。但し、インデントは漢字空白なので、 半角スペースに変換してください。 Option Explicit Dim strArgument, myStr, repStr, objRE, newStr, Stm Set objRE = New RegExp objRE.Pattern = "(" & vbCrLf & "){3,}" repStr = vbCrLf & "[dummy]" & vbCrLf objRE.Global = True For Each strArgument in Wscript.Arguments   Set Stm = CreateObject("ADODB.Stream")   Stm.Open   Stm.Type = 2   Stm.Charset = "utf-8"   Stm.LoadFromFile strArgument   Stm.Position = 0   myStr = Stm.ReadText   newStr = objRE.Replace(myStr,repStr)   Stm.Position = 0   Stm.WriteText newStr   Stm.SetEOS   Stm.Position = 0   Stm.SaveToFile strArgument, 2   Stm.Close   Set Stm = Nothing Next

Kazu_creator
質問者

お礼

ご教授ありがとうございました。確かにこれで機能しました! これから、上記のスクリプトをリバースエンジニアリング(という程のことでもないのでしょうが、経験者にとっては)して、自分のものにしていきたいと思います。 Perlと浮気しながらの勉強ですので、亀の歩みになるかも知れませんが、またバカな質問をした際には、ご助言頂けると幸いです。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

ADODBのStreamで処理したらどうなりますか? Dim Stm Set Stm = CreateObject("ADODB.Stream") Stm.Open Stm.Type = 2 Stm.Charset = "utf-8" Stm.LoadFromFile strArgument Stm.Position = 0 myStr = Stm.ReadText == 今までの処理 == Stm.Position = 0 Stm.WriteText newStr Stm.SetEOS Stm.Position = 0 Stm.SaveToFile strArgument Stm.Close Set Stm = Nothing

Kazu_creator
質問者

補足

まだ始めたばかりなので、見当はずれなことをしてたら御免なさい。 以下のようにするということでしょうか。 (ADODBのStream自体が初耳でした。検索して調べてみましたが、わかったようなわからないような…) 結果:この場合6行目で、「引数が間違った型、許容範囲外、または競合しています。」「コード:800A0BB9」とエラーになってしまいます。 Dim Stm Set Stm = CreateObject("ADODB.Stream") Stm.Open Stm.Type = 2 Stm.Charset = "utf-8" Stm.LoadFromFile strArgument Stm.Position = 0 myStr = Stm.ReadText Set FS = CreateObject("Scripting.FileSystemObject") For Each strArgument in Wscript.Arguments Set ts=Fs.OpenTextFile(strArgument,1,True,TristateTrue) myStr=ts.ReadAll Set objRE = New RegExp objRE.Pattern = "(" & vbCrLf & "){3,}" repStr = vbCrLf & "[dummy]" & vbCrLf objRE.IgnoreCase = True objRE.Global = True objRE.Multiline = True newStr = objRE.Replace(myStr,repStr) ts.Close Set ts = FS.OpenTextFile(strArgument,2,True,TristateTrue) ts.Write newStr ts.Close Next NextStm.Position = 0 Stm.WriteText newStr Stm.SetEOS Stm.Position = 0 Stm.SaveToFile strArgument Stm.Close Set Stm = Nothing

関連するQ&A

  • 正規表現でテキストの中身を置換したい(VBS)

    初心者で、もしかしたらすっごく恥ずかしい事を聞いているかも知れませんが・・・ テキストファイルの中を正規表現を使って検索し、指定(固定)文字列と置換したいのですが、どうもうまく行きません。 ソースは以下のような物です。 ----- Set FS = CreateObject("Scripting.FileSystemObject") Set ts=Fs.OpenTextFile("C:\Program Files\ABC\EFG.txt",1) myStr=ts.ReadAll repStr = "NG_PATH =D:\ABC\HIJ" Set objRE = New RegExp objRE.Pattern = "^NG_PATH.*=C:\\Program\sFiles\\ABC\\HIJ" objRE.IgnoreCase = True objRE.Global = True newStr = objRE.Replace(myStr,repStr) ts.Close Set ts = FS.OpenTextFile("C:\Program Files\ABC\EFG.txt",2) ts.Write newStr ts.Close ------- ●ポケットリファレンスの内容を見て、組み合わせながら作っています ^_^; ●置換対象ファイルの中をobjRE.Patternで指定している内容で検索すると見つかります。 ●置換対象ファイルの更新日時を確認すると、VBS実行時間で更新されています。 それから「myStr」や「newStr」は、任意の変数を宣言して、そっちを使う事って出来ますか?

  • vbsで2文字以上の空白を改行に変換するには?

    恥ずかしながら、vbs初心者です。 vbsでテキストファイルを読み込んで、 2文字以上の空白を改行に変換するにはどうすれば宜しいでしょうか? 以下???のところに正規表現で \n は使用出来ないようですので、どなたかご教授頂けないでしょうか? set objRE = New RegExp objRE.Pattern = "\s{2,}" objRE.IgnoreCase = True objRE.Global = True strData = objRE.Replace(strData,???)

  • VBSでカンマ区切り

    お世話になっております。 VBSで、CSVファイルをカンマ区切りで配列にし、 ファイルに書き出したいです。 下記のスクリプトを実行すると3行の改行と これ⇒ ---------------- だけ出力されます。 Splitは使用できないのでしょうか? どこが間違っているのかわかりません。 ご教授いただけませんでしょうか。 '--------------------------------------------------------------- On Error Resume Next Set OBJFS01 = CreateObject("Scripting.FileSystemObject") Set CSVTEXT01 =OBJFS01.OpenTextFile("C:\tmp\CSVTEXT.log") Set LOGTEXT01 =OBJFS01.OpenTextFile("C:\tmp\LOGTEXT.log",8,False) '--------------------------------------------------------------- i = 0 Dim HAIRETU(27) Do While i < 6 HAIRETU(27) = Split(CSVTEXT01, ",") LOGTEXT01.WriteLine(HAIRETU(2)) LOGTEXT01.WriteLine(HAIRETU(3)) LOGTEXT01.WriteLine(HAIRETU(4)) LOGTEXT01.WriteLine("----------------") i = i + 1 Loop LOGTEXT01.close CSVTEXT01.close

  • VBS正規表現の方法

    教えてください。 <内容> VBSにてメールアドレスチェックをしているのですが、うまくいきません。 <仕様> アカウント 大文字不可。 ドメイン  大文字不可。 最後は英文字で終わる。 .(ドット)とかで終わりにしない。 <ソース> Set objRE = New RegExp objRE.Global = True objRE.IgnoreCase = False objRE.Pattern = "([0-9a-z_\.+-]*)(@?)([0-9a-z-\.]*)([a-z]+)" Set Matches = objRE.Execute(mstrMailValue) Set objSM = Matches(0) mAccount = objSM.SubMatches(0) mAtmark = objSM.SubMatches(1) mDomain = objSM.SubMatches(2) & objSM.SubMatches(3) MsgBox (mAccount & mAtmark & mDomain) If (mAtmark <> "@") Then MailChk = False Else If (Len(mAccount) < 1) Or (Len(mAccount) >= 80) Then MailChk = False Else If (Len(mDomain) <= 3) Or (Len(mDomain) >= 63) Then MailChk = False Else If (mAccount & mAtmark & mDomain) <> mstrMailValue Then MailChk = False Else MailChk = True End If End If End If End If objRE.Patternがうまくいっていないと思います。 全て数値にすると、エラー(VBSがストップ)する。 どなたか教えてくださいませ。m(-_-)m 上記のソースよりも他の手があれば教えてください。

  • 読み込むテキストファイルが改行だけの場合について

    あるテキストファイルC:\test.txtが改行だけのファイルの場合、 下記のプログラムにおいて、.Read(1)で何が読み込まれるの でしょうか? Set myFso = CreateObject("Scripting.FilesystemObject") Set mytxt = myFso.OpentextFile("C:\test.txt", 1, 0) With mytxt Do While mytxt.AtEndOfStream <> True mystr = .Read(1) If mystr = "" Then j = 0 End If Loop .Close End With Set mytxt = Nothing

  • VBSで、日本語文字列の抽出が、うまくいきません。

    VBSで、日本語文字列の抽出を行いたいのですが、日本語がうまく動作しません。 もし、対処法などがあれば、教えていただければ、と思います。 プログラムとしては、あるファイルの中から、ある文字列(メールから、名前を抜き出す、など)を抽出して、 別ファイルに書き出すことをしたいのですが、 英数字(半角)では動作するのですが、日本語(全角)では動作ができません。 エンコーディングなどが問題だと思うのですが、プログラムがあまり分からないため、困っています。 良い解決法などあれば、教えていただければ、と思います・・・。 ----(現在のファイル:test.vbs)----------- Const ForReading = 1,ForWriting = 2,ForAppending = 8 '定数の指定 Set Fs = WScript.CreateObject("Scripting.FileSystemObject") sFile = InputBox("検索するファイルのパス") sWord = InputBox("検索する文字列") Set oTs1 = Fs.OpenTextFile(sFile,ForReading) Set oTs2 = Fs.CreateTextFile("result.csv",True) oTs2.WriteLine "ファイルパス= " & sFile oTs2.WriteLine "検索文字= " & sWord oTs2.WriteBlankLines 1 Do Until oTs1.AtEndOfStream sLine = oTs1.ReadLine If InStr(sLine,sWord)<>0 Then dim i'検索文字列 dim j'半角スペースの位置 dim Res'書き出す内容 dim n,m i= InStr(sLine,sWord) j = InStr(i, sLine, Chr(32)) n = j-i Res = Mid(sLine, i, n) oTs2.Write "Line:" & oTs1.Line - 1 & ", " & Res & vbCrLf End If Loop oTs1.Close oTs2.Close MsgBox "書き出し完了" ---------------------------------------------------------------

  • Excel97 VBA とVBSのsplit関数

    新しい職場で、Excel VBAでデータを取り込み、それを改行文字ごとにsplit関数で区切って配列に入れようとしました。 arr=split(文字列,vbcrlf) って感じでですね。しかし、なんとその職場のExcelのバージョンが97のため、VBAでsplit関数が使えず、この意図が実現できませんでした。そのため、ネットで調べてVBScriptのsplit関数を流用しようとしたのですが、「終了していない文字列型の定数です。」とエラーが出てしまいます。ソースは次のとおりなのですが、どう直せばいいでしょうか。改行文字で区切るのでなく、カンマなどで区切るのなら、上手く出来るのですが・・・。 Sub sample() Dim vs As Object Dim rtn As Variant Dim q As String Dim buf As String q = Chr$(34) 'ダブルクォーテーション Set vs = CreateObject("ScriptControl") vs.Language = "VBScript" 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用 buf = "1" & vbCrLf & "2" & vbCrLf & "3" '改行で区切った文字。実際は、もっと複雑な文字を取り込みます。 rtn = vs.Eval("split(" & q & buf & q & ", vbCrLf)") 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用 Debug.Print rtn(1) 'ここで「終了していない文字列型の定数です。」エラーが出る End Sub

  • VBS 改行無しのファイル抽出方法

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ path = "a.txt" Set FSO = WScript.CreateObject( "Scripting.FileSystemObject" ) '全行読み込み処理 (改行を1行単位として) Set f = FSO.OpenTextFile( path ) Do Until f.AtEndOfStream line = f.ReadLine() i_line = f.Line - 1 Loop WScript.Echo "全件数= " & i_line '最終行-5読み込み処理 Set f = FSO.OpenTextFile( path ) For i=1 To i_line - 6 f.SkipLine Next LAST5 = f.ReadLine() MOJI = Mid(LAST5,20,5) WScript.Echo "文字 = " & MOJI コード------------------------------------------------------------------ 上記VBSの簡単な流れは・・・ (1)改行で1行とみなす a.txt を全行取得。 (2)全件数を表示 (3)最終行から5行前の行まで移動。 (4)(3)の行から20文字からの5文字を取得。 (5)5文字を表示。 とこんな感じです。 しかし、これだと改行有のファイルにのみ有効で 改行無には対応出来ません。 例えば120文字で1行とみなすファイルでも同様の 取得がしたいのです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • VBSでセキュリティ「中」のAccessをメッセージなしに開きたい

    AccessのテーブルにCSVのデータをインポートするVBSを作っていますが、そのVBSを実行するパソコンののAccessのセキュリティが「中」となっているため、実行時に「開くかどうか」を聞いてきます。 セキュリティレベルを「低」に変更できないため、VBSか、Accessファイルに修正をしなければいけないのですが、どうすればよいか、よくわかりません。 ちなみに、VBSのコーディングは以下のようになっています。 'アクセスオブジェクトセット Set objAccess = CreateObject("Access.Application") 'データベースオープン objAccess.OpenCurrentDatabase(strMdbName) 'データベースセット Set objDB = objAccess.CurrentDb 'インポート実行 objAccess.DoCmd.TransferText ,defFile,strTableName,strInFile,False 'データベースクローズ objAccess.CloseCurrentDatabase s = s & "CloseCurrentDatabase" & vbCrLf objRS.Close objDB.Close Set objRS = Nothing Set objDB = Nothing Set objAccess = Nothing どうか、助けてください。お願いします。

  • VBS

    VBSであるファイルを1行ずつ読み込み、その読み込んだ値を ある別のファイルにリダイレクトしたいのですが、 どのように書けばよいか教えてください。 下記のように、echoでは出すことができるのですが、 ファイルにリダイレクトというのができません。 よろしくお願いします。 ==== sample shell ========================= Option Explicit On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile("d:\dr1.txt") If Err.Number = 0 Then Do While objFile.AtEndOfStream <> True WScript.Echo objFile.ReadLine Loop objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing ============================================================

専門家に質問してみよう