あるフォルダ以下にあるすべてのテキストファイルの頭に

<!-- #include virtual="/include.inc" -->
と1行追加したいのですが、テキストファイルの数が500くらいあるので、1つ1つやると大変です。

何かよい方法、もしくは良いフリーソフトをご存知の方居ましたら、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/03/16 15:08:47
  • 終了:2007/03/23 15:11:11

回答(8件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/03/16 15:12:58

ポイント19pt

ここで紹介されているものなら大抵いけそうに思います。

Download: Windows > ユーティリティ > テキストファイル用 > テキスト変換

id:yamazakiis

置換は出来るんですけど、ページの先頭となると出来るのありますか?

また、フォルダ以下をいっぺんにというもの。

2007/03/16 15:26:29
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/03/16 15:39:26

ポイント19pt

とりあえず2つほどダウンロードしてみたけど出来そうですよ。

ファイルの検索・一括置換 Grep and Replace(Windows95/98/Me / ユーティリティ)

Greplace(Windows95/98/Me / ユーティリティ)

置換は出来るんですけど、ページの先頭となると出来るのありますか?

ページ先頭の1行にマッチ → 指定した文字列+元のページ先頭の一行

とかの置換をすれば出来るでしょう。

また特殊文字としてページ先頭そのものを現すコードを指定できるものもあるのでその場合上のような小細工は必要なく

ページ先頭 → 指定した文字列

の置換を行うだけです。


また、フォルダ以下をいっぺんにというもの。

少なくとも上記二つはサブフォルダを含むデータを一括で変換できます。

id:yamazakiis

「ページ先頭の1行にマッチ」

ページ先頭の1行目は、ファイルによって異なるとしたら無理ですよねぇ。


「特殊文字としてページ先頭そのものを現すコードを指定できるもの」

この2つのソフトはできるのでしょうか?

出来るとしたら、そのコードは何ですか?

2007/03/16 16:26:31
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402007/03/16 16:33:46

ポイント18pt

ページ先頭の1行目は、ファイルによって異なるとしたら無理ですよねぇ。

いえ、正規表現とか使えば出来ます。

特殊文字としてページ先頭そのものを現すコードを指定できるもの

たとえば Greplace なら、\A で文頭を表す。

id:yamazakiis

正規表現を使う時は、どうなりますか?

2007/03/16 17:55:32
id:beatgoeson No.4

beatgoeson回答回数128ベストアンサー獲得回数142007/03/16 16:29:46

ポイント18pt

Windowsならコマンドラインからcopyコマンドでテキストファイルを結合してはいかがでしょう。

(1) 挿入するテキストを作成。たとえば、insert.dat

insert.datの中身

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

<!-- #include virtual="/include.inc" -->

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

(2) 変換元のファイルがあるフォルダの下に afterというフォルダを作成

(3) conv.bat というバッチファイルを作成

  この例では、*.txt を対象としてます。

conv.batの中身

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

for %%x in (*.txt) do (copy/b insert.dat+%%x after\%%x)

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

(5) conv.bat をコマンドラインから実行

(6) after 以下に変換されたファイルができる

id:llusall No.5

llusall回答回数505ベストアンサー獲得回数612007/03/16 16:38:26

ポイント18pt

1.以下のスクリプトを[hoge.vbs]等の好きな名前で、デスクトップあたりに保存

2.Cドライブに、[できた]という名前でフォルダを作成

3.ファイルをアイコンにドラッグ&ドロップすればOK。

Option Explicit

Const FOLDER = "C:\できた" '■編集したファイルを入れる場所

Const ADD_HEADER_LINE = "<!-- #include virtual=""/include.inc"" -->" '■先頭に追加する文字

Call Main()

Sub Main()

    Dim objArgs

    Dim i

    Dim nArgCnt

    Dim bRtn

    Dim sResultFile, sPath

    Dim sFname

    Dim objFS, objTXT, objTXT2

    Dim strData

    Err.Clear

    'コマンドライン引数の有無チェック

    Set objArgs = WScript.Arguments

    nArgCnt = objArgs.Count

    If nArgCnt = 0 Then

        MsgBox "アイコンにファイルをドラッグ&ドロップしてください。", vbExclamation

        Exit Sub

    End If

    Set objFS   = CreateObject("Scripting.FileSystemObject")

    If objFS.FolderExists(FOLDER) Then

    Else

        objFS.CreateFolder (FOLDER)

    End If

    'ファイル数の処理を実行

    For i = 0 To nArgCnt -1

        sPath = objArgs(i)

        sFname = objFS.GetFileName(sPath)

        Set objTXT  = objFS.OpenTextFile( sPath, 1, False )

        Set objTXT2 = objFS.CreateTextFile( FOLDER & "\" & sFname , True )

        strData = objTXT.ReadAll

        objTXT2.WriteLine(ADD_HEADER_LINE)

        objTXT2.WriteLine(strData)

        objTXT.Close

        Set objTXT  = Nothing

        objTXT2.Close

        Set objTXT2 = Nothing

    Next

    MsgBox "おしまい。", vbInformation

End Sub

id:yamazakiis

ファイルをD&Dしなければいけなさそうですね。

フォルダ以下の階層が複雑なので、ちょっと大変かも知れません。。

2007/03/16 17:07:12
id:cuvotopia No.6

cuvotopia回答回数8ベストアンサー獲得回数02007/03/16 17:15:16

ポイント18pt

Windowsならバッチファイルで、


@echo off

for %%i in (%*) do copy header /b + %%i /b .\copy\%%i


とか。


上記のバッチファイルをaddhead.batとか名前をつけて、

> addhead.bat *


とやれば、実行フォルダ内の全ファイルが、

header というファイルと結合されて、

copyフォルダに出力されます。

(copyフォルダは事前に作っておいてください)


header内テキストのお尻に改行を入れておけば、

できたファイルの1行目がheader内容になるはず。


headerファイルと自分自身(バッチファイル)もコピーされる点がちょっとださいですが。

id:Bookmarker No.7

しおり回答回数191ベストアンサー獲得回数342007/03/18 17:01:55

ポイント10pt

Rubyならこんな感じ。

header_insert.rb

#!ruby -Ks

require 'fileutils'

def put_usage
  $stderr.puts "Usage: #{File.basename($0)} header srcdir dstdir"
end

class HeaderInsert
  def initialize(header_file, src_dir, dst_dir, buf_size = 2048,
		 copy_options = {:preserve => true})
    @header_file = header_file
    @src_dir = src_dir
    @dst_dir = dst_dir
    @buf_size = buf_size
    @copy_options = copy_options
  end

  private
  def add(src_file, dst_file)
    File.open(dst_file, "ab") do |dst|
      File.open(src_file, "rb") do |src|
	buf = ''
	while src.read(@buf_size, buf)
	  dst.write(buf)
	end
      end
    end
  end

  def insert(src_dir, dst_dir)
    Dir.foreach(src_dir) do |file|
      next if /^\.\.?$/ =~ file
      src_file = File.join(src_dir, file)
      dst_file = File.join(dst_dir, file)
      if File.directory? src_file
	insert(src_file, dst_file)
      else
	unless File.exist? dst_dir
	  FileUtils.mkdir_p(dst_dir)
	end
	FileUtils.copy(@header_file, dst_file, @copy_options)
	add(src_file, dst_file)
      end
    end
  end

  public
  def execute
    insert(@src_dir, @dst_dir)
  end
end

if ARGV.size != 3
  put_usage
  exit 1
end

header_insert = HeaderInsert.new(ARGV[0], ARGV[1], ARGV[2])
header_insert.execute

実行例:

D:\>ruby header_insert.rb header.txt srcdir dstdir

これで、srcdir配下のファイル全ての先頭にheader.txtの内容を挿入したファイルをdstdir配下へ作成します。

(フォルダ構成も保ちます。)

id:Mook No.8

Mook回答回数1312ベストアンサー獲得回数3912007/03/16 22:44:27

ポイント10pt

VBS ですが、下記のものでどうでしょうか。


下記のファイルをAddHeader.vbs として保存します。

DataPathの設定(赤い部分) を対象のフォルダに書き換えます。

'--------------------------------------------------------------
'   DataPath 下のフォルダにあるファイル全ての先頭に
'   HeaderLine を追加する。
'--------------------------------------------------------------
Option Explicit

'--------------------------------------------------------------
Const DataPath = "C:\Data"
Const HeaderLine = "<!-- #include virtual=""/include.inc"" -->"
'--------------------------------------------------------------
Const ForReading = 1
Const ForWriting = 2
'--------------------------------------------------------------
    Dim fso
    Set fso = CreateObject( "Scripting.FileSystemObject")
    ReplaceFiles fso, fso.GetFolder( DataPath ) 
'--------------------------------------------------------------
Sub ReplaceFiles( fso, objFolder )
'--------------------------------------------------------------
    '--- フォルダ内のファイルを処理
    Dim objFile
    For Each objFile In objFolder.Files
        AddHeader fso, objFile
    Next

    '--- サブフォルダを処理
    Dim objSubFolder
    For Each objSubFolder In objFolder.SubFolders
        ReplaceFiles fso, objSubFolder
    Next
End Sub

'--------------------------------------------------------------
Sub AddHeader( fso, objFile )
'--------------------------------------------------------------
    Dim data
    With fso.OpenTextFile( objFile.Path, ForReading )
        data = .ReadAll()     '--- 元のデータを読込
        .Close
    End With

    With fso.OpenTextFile(   objFile.Path, ForWriting, True )
        .WriteLine HeaderLine '--- 先頭行を書き出し
        .Write data           '--- 元のデータを追記
        .Close
    End With
End Sub

AddHeader.vbs を実行(ダブルクリック)すれば、DataPath で指定したフォルダ下のすべてのファイルの先頭ににヘッダを書き足します。

(なので、このファイルは対象フォルダの外へ保存してください。)


実行時はファイルを書き換えますので、バックアップを取ってからお試しください。


すべてのファイルではなく、特定の拡張子のみ対象にしたい場合は、コメントを有効にしていただければ、補足します。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません