人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

フォルダ直下にある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行目の文字列を挿入。

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

●質問者: はず
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:A1 A3 Kさん VBScript テキスト
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● まきのっぴ
●20ポイント

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);
}

2 ● ween
●20ポイント

例でいいますと

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


3 ● errormap
●20ポイント

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

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


4 ● ween
●20ポイント

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

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

今回のはファイル名を"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

5 ● Mook
●20ポイント

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


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

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

'--------------------------------------------------------------
' 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

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


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


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ