フォルダ直下にある500個のファイルの先頭に、別ファイルで作った文字列を挿入させる方法はありますでしょうか?


ネットで調べましたら、このようなVBScriptが落ちていたのですが http://q.hatena.ne.jp/1174025325 (一番下のMookさんの回答)

この場合には、フォルダ直下にある全てのファイルに対してVBScript内で指定した文字列を先頭に挿入させることは出来るのですが、僕が、求めていますのはこれとは少し違いまして・・・500個のテキストファイルに別ファイルで作成した500行の文字列を1行目から順番に、別ファイルの先頭に挿入させる方法となっております・・・。

分りにくいので具体的に説明しますと・・・
Aのフォルダには、a1~a500までのテキストファイルが入っています。bのテキストファイルには、500行の文字列が入っています。

a1ファイルの先頭には、bファイルの1行目の文字列を挿入。
a2ファイルの先頭には、bファイルの2行目の文字列を挿入。
a3ファイルの先頭には、bファイルの3行目の文字列を挿入。

こんな具合となっております。
何とも我がままな質問ですが、いかがでしょうか・・・ご教授頂けますと大変助かります!!!!!

回答の条件
  • 1人5回まで
  • 登録:2007/10/08 01:56:22
  • 終了:2007/10/15 02:01:02

回答(6件)

id:pmakino No.1

まきのっぴ回答回数354ベストアンサー獲得回数282007/10/08 02:40:59

ポイント20pt

Perl ならこんな感じでしょうか。

use strict;
use warnings;

my @b;
open(my $fd, '<', 'b') or die;
@b = <$fd>;
close($fd);

my @files;
opendir(my $dir, '.') or die;
foreach (readdir $dir) {
	push @files, $_ if -f $_ ;
}
closedir($dir);

my $i = 0;
foreach my $file (sort @files) {
	$/ = undef;
	open($fd, '<', $file) or die;
	my $data = <$fd>;
	close($fd);

	$data = $b[$i++] . $data;

	open($fd, '>', $file) or die;
	print $fd $data;
	close($fd);
}
id:ween No.2

ween回答回数78ベストアンサー獲得回数72007/10/08 03:20:51

ポイント20pt

例でいいますと

6行目のdpathにAフォルダのパスに

7行目のfpathにbのテキストファイルのパスに書き換えてください。

Aフォルダの中のbフォルダに1行ずつ挿入した元ファイルのコピーが作成されます。

option explicit

dim dic, sfo, sac, rtxt, wtxt_r, wtxt_w, cdir, wdir, i
dim dpath, fpath, rc, rall

dpath = "C:\testA\A"' 500のファイルが入っているディレクトリのパス
fpath = "C:\testB\b.txt"' 500行あるファイルのパス

set dic = createobject("scripting.dictionary")
set sac = createobject("shell.application")
set sfo = createobject("scripting.filesystemobject")
    if sfo.folderexists(sfo.buildpath(dpath, "b")) = false then sfo.createfolder(sfo.buildpath(dpath, "b"))
on error resume next
set rtxt = sfo.opentextfile(fpath)
    if err.number = 0 then
        rc = 1
        do until rtxt.atendofstream
            dic.add rc, rtxt.readline
            rc = rc + 1
        loop
        rtxt.close
        set wdir = sac.namespace(dpath).items()
            for i = 0 to wdir.count - 1
                if sfo.fileexists(wdir.item(i).path) then
                    set wtxt_r = sfo.opentextfile(wdir.item(i).path)
                        rall = wtxt_r.readall
                    wtxt_r.close
                    set wtxt_w = sfo.createtextfile(dpath & "\b\" & wdir.item(i).name, 2)
                        wtxt_w.write(dic.item(i + 1) & vbcrlf & rall)
                    wtxt_w.close
                end if
            next
    end if
set dic = nothing
set sac = nothing
set sfo = nothing
set rtxt = nothing
set wdir = nothing
set wtxt_r = nothing
set wtxt_w = nothing

id:errormap No.3

errormap回答回数101ベストアンサー獲得回数22007/10/08 04:54:36

ポイント20pt

リネームソフトで検索をかけてみて下さい

そういうソフトがたくさんありますよ

id:ween No.4

ween回答回数78ベストアンサー獲得回数72007/10/08 06:54:17

ポイント20pt

コメント欄が開放されていませんので、解答欄にて失礼します。

申し訳ないです、最初の私の回答だとファイル名(数字)順に行われないです。

今回のはファイル名を"a*.txt"を前提に書いてますので、都合に合わせて変えてください。

option explicit

'フォルダのパス
const dpath = "C:\A"

'ファイルのパス
const fpath = "C:\B\b.txt"


dim rtxt, rc, getall, i, filename
dim sfo, dic, objread, objwrite

set sfo = createobject("scripting.filesystemobject")
set dic = createobject("scripting.dictionary")
on error resume next
set rtxt = sfo.opentextfile(fpath)
    if err.number = 0 then
            if sfo.folderexists(sfo.buildpath(dpath, "B")) = false then sfo.createfolder(sfo.buildpath(dpath, "B"))
        rc = 1
        do until rtxt.atendofstream
            dic.add rc, rtxt.readline
            rc = rc + 1
        loop

        for i = 1 to dic.count


            'ファイルの名前です a*.txt にしてあります *の部分は数字
            filename = "a" & i & ".txt"


            set objread = sfo.opentextfile(dpath & "\" & filename)
                if err.number = 0 then
                    getall = objread.readall
                    objread.close
                    set objwrite = sfo.createtextfile(dpath & "\B\" & filename, 2)
                    objwrite.write(dic.item(i) & vbcrlf & getall)
                    objwrite.close
                end if
        next
    end if
set sfo = nothing
set dic = nothing
set objread = nothing
set objwrite = nothing
id:Mook No.5

Mook回答回数1312ベストアンサー獲得回数3912007/10/08 08:41:05

ポイント20pt

前回没になった回答ですが、他の方のご参考になれば何よりです。


前回のものを改良してみましたが、下記のような感じでどうでしょうか。

今回例示されたファイル構成を実行するものですが、実際と異なるようでしたら若干の修正が必要です。

'--------------------------------------------------------------
'   DataPath フォルダにあるファイル a1 ~ a500 までのファイルに
'   b ファイルの n 行目を先頭に追加する。
'--------------------------------------------------------------
Option Explicit

'--------------------------------------------------------------
'--- a ファイルのフォルダパス
Const DataPath = "D:\Data\"
'--- b ファイルパス
Const bFilePath = "D:\Data\b"

'--------------------------------------------------------------
Const ForReading = 1
Const ForWriting = 2
'--------------------------------------------------------------
    Dim fso
    Set fso = CreateObject( "Scripting.FileSystemObject")

    Dim bLines
    bLines = Split( fso.OpenTextFile( bFilePath ).ReadAll(), vbNewLine )

    Dim i
    For i=LBound(bLines) To UBound( bLines )
        If Len( bLines(i) ) > 0 Then
            AddHeader fso, i+1, bLines(i)
        End If
    Next

'--------------------------------------------------------------
Sub AddHeader( fso, fileNumber, headerLine )
'--------------------------------------------------------------
    Dim dstFilePath
'--- 対象ファイル
    dstFilePath = DataPath & "a" & fileNumber

    If fso.FileExists( dstFilePath ) = False Then
        WScript.Echo dstFilePath & "がありません"
        Exit Sub
    End If

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

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

ファイルをバックアップした上で、赤い部分を実際の環境に合わせてからお試しください。


不明な点があったら、コメントください。

id:Bookmarker No.6

しおり回答回数191ベストアンサー獲得回数342007/10/08 13:24:13

ポイント10pt

Ruby ならこんな感じ。

header_insert2.rb

#!ruby -Ks

require 'fileutils'

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

class HeaderInsert2
  def initialize(header_file, prefix, src_dir, dst_dir, suffix = '.txt',
                 buf_size = 2048)
    @header_file = header_file
    @prefix = prefix
    @suffix = suffix
    @src_dir = src_dir
    @dst_dir = dst_dir
    @buf_size = buf_size
  end

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

  def insert(src_dir, prefix, dst_dir)
    unless File.exist? dst_dir
      FileUtils.mkdir_p(dst_dir)
    end
    no = 1
    File.foreach(@header_file) do |header|
      header.chomp!
      file = prefix + no.to_s + @suffix
      src_file = File.join(src_dir, file)
      dst_file = File.join(dst_dir, file)
      add(src_file, header, dst_file)
      no += 1
    end
  end

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

if ARGV.size < 4 || 5 < ARGV.size
  put_usage
  exit 1
end

header_insert = HeaderInsert2.new(*ARGV)
header_insert.execute

実行例:

D:\>ruby header_insert2.rb header2.txt a srcdir dstdir

これで、srcdir 配下のファイル「"a" + 番号 + ".txt"」の先頭に header2.txt の各行の内容を挿入したファイルを dstdir 配下へ作成します。

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

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

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

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

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