プロが教えるわが家の防犯対策術!

以下のように記述されたc:\tmp\test.txtの3行目に、
test.txt######################ここから
test1
test2
test3
test4
test5
##############################ここまで

以下のように記述されたc:\tmp\insert.txtの中身全てを追加書きして、
insert.txt####################ここから
insert1
insert2
insert3
insert4
insert5
#############################ここまで

c:\tmp\test.txtが以下のような結果になるVBScriptを作成したいです。
test.txt#####################ここから
test1
test2
insert1
insert2
insert3
insert4
insert5
test3
test4
test5
#############################ここまで

色々調べたのですがどうしても上手くいきません。
もし上記結果が得られる方法がありましたらご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#1 Wizard_Zeroです。


雑なコードですが・・・


Dim objFSO
Dim fileRead, fileWrite
Dim strTestLines
Dim i

Set objFSO = CreateObject("Scripting.FileSystemObject")

' test.txt を読み込んで配列化
Set fileRead = objFSO.OpenTextFile("test.txt")
strTestLines = Split(fileRead.ReadAll, vbCrLf)
fileRead.Close

' inset.txt を読み込み、test.txt を書き込み(上書き)で開く
Set fileRead = objFSO.OpenTextFile("insert.txt")
Set fileWrite = objFSO.CreateTextFile("test.txt", True)

' test.txt へ上書き
fileWrite.WriteLine strTestLines(0) ' 元の1行目
fileWrite.WriteLine strTestLines(1) ' 元の2行目
fileWrite.WriteLine fileRead.ReadAll ' insertのすべて

' 元の残り - 1行
For i = 2 To UBound(strTestLines) - 1
fileWrite.WriteLine(strTestLines(i))
Next

' 最後の1行は改行なし
fileWrite.Write strTestLines(UBound(strTestLines))

fileWrite.Close
fileRead.Close
    • good
    • 0
この回答へのお礼

ご教示頂いたコードで試したところ、理想的な結果を得ることができました!
迅速かつ丁寧にご回答頂き大変感謝します。
ありがとうございました。

お礼日時:2009/10/08 07:25

いくつか方法があります。



方法1:読み取りファイルを先に複製
1. test.txt を複製しtest.txt.tmpを作る
2. test.txt.temp と insert.txt を読み取りモードで開く
3. test.txt を書き込み(上書き)モードで作成
4. test.txt に test.txt.tempから2行分読み取って書き込み
5. inser.txt から全行読み取って書き込み
6. test.txt.temp の残りの行を読み取って書き込み
7. test.txt.temp を削除

この方法は、test.txtの作成日時をそのままに更新日時だけが変わります。

方法2:一旦一時ファイルに書き出してリネーム
1. test.txt と insert.txt を読み取りモードで開く
2. test.txt.tmpを書き込みモードで開く
3. test.txt から2行、inser.txtから全行、test.txtの残りの順でtest.txt.tmpへ書き込む
4. test.txt を削除し、test.txt.tmpをtest.txtへリネーム

この方法だとファイルの作成日時も新しくなります。

方法3:test.txtの中身をすべて読み込んでおく
1. test.txtを開き、全行を読み込んでおく(改行でSplitした文字列配列として)
2. inser.txtを読み取りモードで開く
3. test.txtを上書きモードで開く
4. test.txtに文字列配列から2行分、insert.txtの全行、文字列配列の残りの順で書き込む

作業用のファイルを複製したり削除したりしません。

どの方法で試しているのか、コードのどの部分がうまくいかないのかも示していただければより詳しく回答できます。
    • good
    • 0
この回答へのお礼

方法3:test.txtの中身をすべて読み込んでおく
1. test.txtを開き、全行を読み込んでおく(改行でSplitした文字列配列として)
2. inser.txtを読み取りモードで開く
3. test.txtを上書きモードで開く
4. test.txtに文字列配列から2行分、insert.txtの全行、文字列配列の残りの順で書き込む

こちらが私もトライしている方法に近く、且つ処理後のファイルの結果が最も理想的です。
もし可能でしたら、サンプルコードをご掲示頂けると大変助かります。

お礼日時:2009/10/08 02:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q0バイトのテキストファイル

お世話になっております。

ファイルから特定の単語を抜き出し、新規でファイルを作成し、その中に単語を移行するスクリプトを作成しました。

しかし、単語のファイルが無い場合はエラーを出してくれるのですが、単語のファイルが空ファイル(0バイト)だった時、単語を移行する処理は行います。ですが、結果が空ファイルのままになります。

以下のスクリプトを作成したいのですが、勉強不足でうまくいきません。皆様のお知恵をお貸し下さい。
---------------------------------------------------------------
(1)単語のファイルがある事を確認。

(2)単語のファイルが空ファイルだった場合、移行する処理の中断およびエラー警告メッセージを表示。

(3)空ファイルじゃなかった場合、移行する処理を行う。
---------------------------------------------------------------

VBSを作成する場合、空ファイルが0バイトとして判断するのか、中身が白紙だった場合に判断するのか、という疑問もあって今回の質問をさせて頂きました。

どうか宜しく御願い致します。

お世話になっております。

ファイルから特定の単語を抜き出し、新規でファイルを作成し、その中に単語を移行するスクリプトを作成しました。

しかし、単語のファイルが無い場合はエラーを出してくれるのですが、単語のファイルが空ファイル(0バイト)だった時、単語を移行する処理は行います。ですが、結果が空ファイルのままになります。

以下のスクリプトを作成したいのですが、勉強不足でうまくいきません。皆様のお知恵をお貸し下さい。
--------------------------------------------------------...続きを読む

Aベストアンサー

FileSystemObjectのFileExistsメソッドでファイルの存在を確認できますよ
何行目でエラーになるのかも投稿しましょう
以下のコードの字下げには全角スペースですので半角スペースに置換してから使用してください

Dim oFSO, oFile, oText, oWrite
Set oFSO = CreateObject("Scripting.FileSystemObject")
if oFSO.FileExists("C:\work.txt") then
  Set oFile = oFSO.GetFile("C:\work.txt")
  if oFile.Size = 0 then
    WScript.Echo "空のファイルです"
  else
    ' 単語処理
    Set oWrite = oFSO.CreateTextFile("C:\Write.txt",True)
  end if
else
  WScript.Echo "『C:\work.txt』ファイルが存在しません"
end if

FileSystemObjectのFileExistsメソッドでファイルの存在を確認できますよ
何行目でエラーになるのかも投稿しましょう
以下のコードの字下げには全角スペースですので半角スペースに置換してから使用してください

Dim oFSO, oFile, oText, oWrite
Set oFSO = CreateObject("Scripting.FileSystemObject")
if oFSO.FileExists("C:\work.txt") then
  Set oFile = oFSO.GetFile("C:\work.txt")
  if oFile.Size = 0 then
    WScript.Echo "空のファイルです"
  else
    ' 単語処理
  ...続きを読む

QVBSで指定行に挿入

VBScriptで指定行に文字列を挿入したいと思っていますが可能でしょうか?
例:)2行目に挿入
前    後
1    1
2    挿入列
3    2
     3

先頭から呼んでいき WriteLineを… と思ったのですが、最後尾に追加でした^_^;
で、新規ファイルに順に呼んで(前)を削除、(後)をリネーム。と考えたのですが、スマートではありません。
なにかよいメソッドはあるのでしょうか?

Aベストアンサー

'----------- ファイルシステムオブジェクト作成
Set objFso = CreateObject("Scripting.FileSystemobject")

'----------- 定数の作成
Const ForReading = 1                                  '読取フラグ
Const ForWriting = 2                                   '書込フラグ
Const ForAppending = 8                                 '追記フラグ

Const InsertLine = 2                                   '文字列の挿入行
Const InsertText = "Inserted!"                             '挿入する文字列

Const strPath = "test.txt"                               '処理するテキストファイルのパス

'----------- ファイルが存在することを確認
If objFso.FileExists(strPath) = False Then
MsgBox "指定のファイルがみつかりません"
WScript.Quit                                      'なければ終了
End If

'----------- テキストの行数を確認
Set objRead = objFso.OpenTextFile(strPath , ForReading)            '読取モードでテキストを開く
objRead.ReadAll                                      '全部読むことで最終行へ移動
intLine = objRead.Line                                  '現在の行数を確認
objRead.Close                                       '読取モード閉じる

'----------- テキストの挿入
If intLine <= InsertLine Then                              '挿入行がテキストの行数より大きいか、同じの場合

  Set objAppending = objFso.OpenTextFile(strPath , ForAppending)      '追記モードでテキストを開く
  objAppending.WriteLine InsertText                         '挿入行の追記
  objAppending.Close                                  '追記モード閉じる

Else                                             '挿入行がテキストの行数より小さい場合

  Dim WritingText                                    '書込用の文字列(省略可)
  Set objRead2 = objFso.OpenTextFile(strPath , ForReading)          '読取モードでテキストを開く
  i = 1                                           '行数の確認用の数値
  Do Until objRead2.AtEndOfStream = True                    '終了行まで繰り返し
    If i = InsertLine Then                               '挿入行が来たら、文字列を挿入
      WritingText = WritingText & InsertText & vbCrLf            'vbCrLfは改行コード
    End If

    WritingText = WritingText & objRead2.ReadLine & vbCrLf        '1行読み取り、書込用の文字列に追加
    i = i + 1                                       '読み取った行数を1増やす
  Loop

  objRead2.Close                                    '読取モード閉じる

  Set objWriting = objFso.OpenTextFile(strPath , ForWriting)          '書込モードでテキストを開く
  objWriting.Write WritingText                             '書込用の文字列値を一気に書込み
  objWriting.Close                                    '書込モード閉じる

End If

'----------- 完了メッセージ
MsgBox "挿入完了"




見やすくするため全角スペースを入れてあります。

'----------- ファイルシステムオブジェクト作成
Set objFso = CreateObject("Scripting.FileSystemobject")

'----------- 定数の作成
Const ForReading = 1                                  '読取フラグ
Const ForWriting = 2                                   '書込フラグ
Const ForAppending = 8                                 '追記フラグ

Const InsertLine = 2         ...続きを読む

QDOSコマンドのダブルクォーテーションの扱い

DOSコマンドでダブルクォーテーションを検索し、
リダイレクションをすることが出来なくて困っています。
例えば
findstr "\"!" a.txt
は出来ますが
findstr "\"!" a.txt >b.txt
とするとリダイレクションが出来ません。
grepも同じようです。

またunixコマンドではシングルクオートは、「囲まれた中身をそのままの文字として利用」し、ダブルクオートは、「囲まれた中身に$HOME など $ で始まる文字列があれば、
それを環境変数、シェル変数といった、値に置き換えてから、利用する」という明確な違いがありますが、DOSコマンドでは明確な違いはあるのでしょうか?

unixのshellをDOSコマンドに移植しています。
DOSコマンドの参考Webもあまり見つからなくて困っています。
もし参考になりそうなWeb等ありましたら教えてください。

Aベストアンサー

"と'の違いですが、cmd.exe では ' 特殊文字ではありません。for /f 文のある形式で意味を持つだけでそれ以外の場所では#+-/などと同じ普通の文字です。unixのシェルとは全然違います。

まず質問文の
>findstr "\"!" a.txt >b.txt
ですが、\ はfindstrが正規表現の特殊文字として扱うだけでCMDの構文解析では普通文字なので、"\"が引用符に囲まれた文字列として扱われます。次の!は引用符の外の文字。次の " a.txt >b.txtが、(終りの引用符の欠けた)引用符に囲まれた文字列とみなされますので、リダイレクト記号は引用符の中となり効きません。

>OKだったもの
>findstr ^"\^"!^" a.txt
>findstr \^"! a.txt
^を前置した"は引用符としての意味を失い、そのまま"がfindstrにわたされます。リダイレクト記号をつけても引用符の中で無いので効きます。findstrは検索文字列が"で囲まれていればそれを外して、囲まれていなければそのままが使われますので、どちらでも同じ結果になります。

>以下待ちになるもの
>findstr ^"! a.txt
findstrに "! a.txt が渡るのでa.txtも検索文字列の一部とみなされます(閉じる"がfindstrによって補われる)。従って、標準入力から、! または a.txt という文字列を含む行を探していることになります。
リダイレクトをつけると引用符の外なので効きます。

>findstr "^"!" a.txt
引用符の中で^は"をエスケープしないので1個目と2個目の"がペアになり^を囲み、3個目はペアの欠けた引用符となり a.txtを囲みます。リダイレクトをつけても引用符の中なので効かないはず。
その後、findstrが文字列を囲む""を外すので、^!つまり行頭の!または a.txtを含む文字を標準入力から探すことになります。

>findstr ^"!^"^" a.txt
^が前置されているので"はCMD的には引用符でなくなりますのでリダイレクトは効きます。
findstr には "!"" a.txt が渡り、文字列を囲む""が外されて、!またはa.txtを含む文字列を標準入力から探す。

>findstr ^" a.txt
同様。

>コンソールには表示できるがリダイレクションでエラーになるもの
>findstr \"! a.txt >b.txt
cmd的には"は引用符なので>b.txtも(終りの欠けた)引用符の中なのでリダイレクトは効きません。
findstr にわたるのは \"! a.txt >b.txtで、検索文字列が "! で残りがファイル名とみなされますが、「a.txt >b.txt」という名前のファイルが無いのでエラー
リダイレクトをつけないで
>findstr \"! a.txt
だと、findstr には \"! a.txt が渡り、検索文字列が "! で、ファイル名がa.txtとなり目的通りになります。

>「"」を検索するには「\^」をつけるということでしょうか。
CMDに引用符とみなされないように^をつけて(この^はCMDが外してからfindstrに渡す)、findstrが"を外さないようにさらに\を前置する必要があるということです。

CMDがまず最初に^や"や>をどのように処理して、次にfindstrが渡された文字列をどう解釈するか段階を分けて考えればわかると思います。これはunixのシェルでも同じですが。
unixのシェルと比べるとCMDの"は変態的です。

"と'の違いですが、cmd.exe では ' 特殊文字ではありません。for /f 文のある形式で意味を持つだけでそれ以外の場所では#+-/などと同じ普通の文字です。unixのシェルとは全然違います。

まず質問文の
>findstr "\"!" a.txt >b.txt
ですが、\ はfindstrが正規表現の特殊文字として扱うだけでCMDの構文解析では普通文字なので、"\"が引用符に囲まれた文字列として扱われます。次の!は引用符の外の文字。次の " a.txt >b.txtが、(終りの引用符の欠けた)引用符に囲まれた文字列とみなされますので、リダイレクト...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qフォルダ内のファイルを取得し別ディレクトリへコピーしたい

Windowであるフォルダ内の全てのファイルを取得して、別のディレクトリのフォルダへコピーしたいです。

バッチコマンドでできれば一番いいのですが、そんな機能をもっているコマンドはないみたいなので、VBスクリプトでも構いません。

いい方法ないでしょうか?

Aベストアンサー

'PDFファイルがあるフォルダ名
strBasePath = "C:\Box"
'コピー先のフォルダ名(このサブフォルダに6桁のフォルダ名が自動作成される)
strCopyPath = "C:\Box"
Call CustomCopyFile(strBasePath,strCopyPath)

'処理ルーチン
Sub CustomCopyFile(BasePath,CopyPath)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(BasePath)
'ファイル名の検索
For Each objFile In objFolder.Files
strFolder = Left(objFile.Name,6)
strCreate = CopyPath & "\" & strFolder
strFname = objFolder.Path & "\" & objFile.Name
'フォルダ自動作成
If Not objFS.FolderExists(strCreate) Then
objFS.CreateFolder(strCreate)
End If
'コピー処理
objFS.CopyFile strFname, strCreate & "\"
Next
End Sub

'PDFファイルがあるフォルダ名
strBasePath = "C:\Box"
'コピー先のフォルダ名(このサブフォルダに6桁のフォルダ名が自動作成される)
strCopyPath = "C:\Box"
Call CustomCopyFile(strBasePath,strCopyPath)

'処理ルーチン
Sub CustomCopyFile(BasePath,CopyPath)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(BasePath)
'ファイル名の検索
For Each objFile In objFolder.Files
strFolder = Left(objFile.Name,6)
strCreate = CopyPath & "\" & strFo...続きを読む

Qvbsでテキストファイル内の文字列検索

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


----------------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strSearchWord

Set tmpFile = WSHFso.OpenTextFile("C:\AAA.txt")

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
strSearchWord = strSearchWord & tmpLine & vbcrlf
Loop


Dim SearchWord
SearchWord = split(strSearchWord," ")


if InStr(SearchWord(ix), "test")<>0 then
WScript.Echo " testを含みます。"
else
WScript.Echo " testを含みません。"

end if


----------------------------------------------------

初心者です。

テキストファイルを指定し、含まれる文字列を検索し、
結果表示したいと考えております。

色々探して、以下で作成したのですが、
うまく動いてくれません。

出来ましたら、テキストファイルの中の文字列の
一部分を指定して動作させたいと思っております。

どなたかご教示のほど宜しくお願い致します。


----------------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell...続きを読む

Aベストアンサー

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'-------------------------------------------
Set tmpFile = WSHFso.OpenTextFile(FileName)

Do Until tmpFile.AtEndOfStream
tmpLine = tmpFile.ReadLine
i = i + 1
nflg= fSearchWord (tmpLine)
If nflg Then Exit Do
Loop
If nflg Then
MsgBox i & "行目に" & sWord &"を含みます。",64
Else
MsgBox sWord &"を含みませんでした。",48
End If
'-------------------------------------------
Function fSearchWord(tmpLine)
Dim flg
SearchWord = Split(tmpLine," ")
For ix = LBound(SearchWord) To UBound(SearchWord)
If Len(Trim(SearchWord(ix))) > 0 Then
If InStr(1, SearchWord(ix), sWord, 1) > 0 Then
flg = True
Exit For
End If
End If
Next
fSearchWord = flg
End Function
'-------------------------------------------

こんにちは。

コードの細かい部分の目的としている部分は良く分からないけれども、少し直してみました。あくまでも、VBSです。元のコードは、ちょっと違うようです。

'-------------------------------------------

Set WSHFso = CreateObject("Scripting.FileSystemObject")
'Set WshShell = CreateObject("WScript.Shell") '??
Dim strSearchWord
dim i
'-------------------------------------------
Public Const FileName ="C:\AAA.txt"
Public Const sWord =""test"
'---------------------...続きを読む

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた


人気Q&Aランキング