#author("2021-10-07T06:02:13+00:00","default:sagasite","sagasite")
[[Programming]] > [[VBS]] > VBSでリストからファイルを作成

RIGHT:2021-10-07 (木) 公開
//RIGHT:2020-05-18 (月) 更新

//----- ----- ----- ----- ----- ----- ----- -----
VBSでリストからテキストファイルを自動生成する方法
//----- ----- ----- ----- ----- ----- ----- -----

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====

#contents

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* やりたいこと [#wants]
- 本の目次データから、対応する内容のテキストファイルを自動的に生成したい。
- VBSでファイルを読み込み、1行ずつ文字列を読み取って、その文字列をファイル名とするテキストファイルを自動で生成したい。

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* VBScript [#code]
以下のようなVBScriptで実現できた。

#code(vbs){{
Option Explicit
On Error Resume Next

Dim objFileSys
Dim dirTmp
Dim strReadFilePath
Dim strWriteDirPath
Dim objReadStream
Dim strLine

'作業フォルダを指定
dirTmp = "C:\tmp\vbs_makefile\"

'リストファイルのパスを指定
strReadFilePath  = dirTmp & "list.txt"

'ファイルを作成するフォルダを指定
strWriteDirPath = dirTmp & "file\"

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'ファイルを読み取り専用で開き、TextStream オブジェクトを取得
Set objReadStream  = objFileSys.OpenTextFile(strReadFilePath, 1)

Do Until objReadStream.AtEndOfStream = True
	'1 行読み込み
	strLine = objReadStream.ReadLine
	
	' ファイル名に使えない文字列のチェック
	Dim tempStr
	Dim replaceChar
	
	tempStr = strLine
	replaceChar = ""
	
	tempStr = Replace(tempStr, "\", replaceChar)
	tempStr = Replace(tempStr, "/", replaceChar)
	tempStr = Replace(tempStr, ":", replaceChar)
	tempStr = Replace(tempStr, "*", replaceChar)
	tempStr = Replace(tempStr, "?", replaceChar)
	tempStr = Replace(tempStr, """", replaceChar)
	tempStr = Replace(tempStr, "<", replaceChar)
	tempStr = Replace(tempStr, ">", replaceChar)
	tempStr = Replace(tempStr, "|", replaceChar)
	tempStr = Replace(tempStr, "[", replaceChar)
	tempStr = Replace(tempStr, "]", replaceChar)
	
	strLine = tempStr
	
	' ファイルの作成
	Dim FSO
	Dim oLog
	Dim makeFilePath
	
	makeFilePath = strWriteDirPath & strLine & ".txt"
	' WScript.Echo makeFilePath
	Set FSO = CreateObject("Scripting.FileSystemObject")
	Set oLog = FSO.CreateTextFile( makeFilePath, True, True )
	oLog.Close()
	Set oLog = Nothing
	Set FSO = Nothing

Loop

objReadStream.Close
Set objFileSys = Nothing
}}

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
** 問題点 [#problem]

Dimで変数を宣言する箇所をLoop内に入れており、何回も宣言しているところ。
本来は、スクリプト全体の先頭でまとめて宣言しておき、ループ内では宣言しない方が良いが、面倒なのでサンプルコードをコピペして、そのまま使った。
何度も繰り返し使う変数は、ループ内の末尾で、Set xxx = Nothing という具合で初期化しておけばOK。(後でコードを清書してもOK)

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 使い方 [#usage]

- 作業フォルダを指定
 dirTmp = "C:\tmp\vbs_makefile\"
のように、Cドライブの直下に作業用のフォルダーを用意しておく。

- リストファイルのパスを指定
 strReadFilePath  = dirTmp & "list.txt"

ここでは「list.txt」というファイルを用意して、その中に、ファイル名のリストをコピーしておく。

~
(例)「時間術大全」という本の目次データをコピペしておく。
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4478106118/vertex9-22/" target="_blank"><img src="https://m.media-amazon.com/images/I/51eo1QkiPoL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4478106118/vertex9-22/" target="_blank">時間術大全 人生が本当に変わる「87の時間ワザ」</a><br>ジェイク・ナップ<br>ダイヤモンド社<br>2019-06-20<br>¥1760</td></tr></table>
}}
~

 0-0-0 時間術大全
 ----------------------------------------
 0-1-0 INTRODUCTION これが「時間オタクの」全技術だ
 0-1-1 どんな状況の人でも時間を生み出せる方法
 0-1-2 あなたの時間の9割は「デフォルト」で決まっている
 0-1-3 「意志力」や「生産性」を上げても意味がない
 0-1-4 Google×YouTube出身の「時間オタク」のメソッド
 0-1-5 時間は「デザイン」できる
 0-1-6 「スプリント」をしてわかった4つの教訓
 0-1-7 こんなに「簡単」に切り替えられる
 :

これを先頭から1行ずつ読み込んで、「0-0-0 時間術大全.txt」のようなファイルを自動で次々と生成していく。

- ファイルを作成するフォルダを指定
 strWriteDirPath = dirTmp & "file\"
ここでは「file」というフォルダーを用意して、その中に、生成したテキストファイルを保存していく。

** フォルダー内の構成 [#fb0cea7a]
フォルダー内の構成は、以下のようになっている。(画像参照)

 C:\tmp\vbs_makefile\
  ├ file
  ├ list.txt
  └ makefile.vbs

&ref(vbs_makefile_1.png);

「makefile.vbs」をダブルクリックすると、「file」フォルダ―の中にテキストファイルが生成されている。
(例)以下のように、目次の項目名をファイル名とするテキストファイルが生成されている。

&ref(vbs_makefile_2.png);

- 改行マークは、ファイル名が空の「.txt」として生成されている。
- 区切り記号として複数書き込んでいた「----------------------------------------」は、何度も上書きされて1つの「----------------------------------------.txt」として生成されている。
このようにゴミファイルもいくつか生成されてしまうので、最終的に目視確認して、不要ファイルを手動で削除する必要がある。

//===== ===== ===== ===== ===== ===== ===== ===== ===== =====
* 参考情報 [#confer]

** (1) ファイルの読み込み [#x5e4f40d]
- VBScript - ファイルを1行ずつ読み込んで処理する : Server World
https://www.server-world.info/query?os=Other&p=vbs&f=4
- ファイルの内容を1行ずつ読み込む方法[VBScript] : バヤシタ
https://bayashita.com/p/entry/show/85
- VBScript Tips (Tips0072)
http://www.whitire.com/vbs/tips0072.html

** (2) ファイル名に使えない文字列のチェック [#v230edd2]
- ファイル名に使用できない文字列が含まれていないか調べる - .NET Tips (VB.NET,C#...)
https://dobon.net/vb/dotnet/file/invalidpathchars.html
- Excel VBA でファイル名に使えない文字を取り除く・チェックする | 勉強とガジェット
http://tanaka-misaki.blogspot.com/2012/02/excel-vba.html

** (3) ファイルの作成 [#gf2186e1]
- VBS(VBScript)によるファイルを作成する方法を紹介
https://www.wannko.net/vbs/file/filemake.html
- 全ては時の中に… : 【VBS】テキストファイルを作成する
http://blog.livedoor.jp/akf0/archives/51371234.html



#html{{
<!--

<hr>
-->
}}


//----------------------------------------
// A8 Ads - sakura VPS banner
~
#html{{
<center><a href="http://px.a8.net/svt/ejp?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" target="_blank"><img border="0" width="468" height="60" alt="" src="http://www21.a8.net/svt/bgt?aid=101108300200&wid=001&eno=01&mid=s00000001717002003000&mc=1"></a><img border="0" width="1" height="1" src="http://www18.a8.net/0.gif?a8mat=1O73NW+3B2PRM+D8Y+BXB8X" alt=""></center>
}}
//----------------------------------------

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS