- PR -

バッチファイルでテキスト読込

投稿者投稿内容
Teraterm
常連さん
会議室デビュー日: 2007/02/15
投稿数: 25
投稿日時: 2008-03-04 11:48
以下につきまして、分かる方いらっしゃいましたらご教授下さい。
初歩的な質問で申し訳ございません。

使用OS:windowsXP
要件:バッチファイルである特定のファイルを読み込み、そのファイル内の文字列を1行
   づつ環境変数に格納したい
-------------------------------------------------------
例:

■読込ファイル(a.txt)

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
  ・
  ・
(不特定多数)

■バッチファイル

バッチでファイル内の各行を環境変更に格納
A=aaaa bbbb cccc
B=dddd eeee ffff
C=gggg hhhh iiii
D= ・
E= ・
(不特定多数)
-------------------------------------------------------

1行だけであれば、特定の環境変数に格納できるのですが、
不特定多数の行を、違う環境変数名で実行する方法が分かりません。
そもそもこのようなことが出来るのかもわかりせん。。。

申し訳ございませんが、分かる方いらっしゃいましたらご教授下さい。

以上、よろしくお願いいたします。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2008-03-04 12:46
saki1208です。

for コマンドを使用すればテキストファイルの行単位で
処理することは可能です。

# 例の内容が処理できるかは別ですが...

# XP で for コマンドを使用したバッチがあったのです
# が、残念ながら今は手元にありません。



[ メッセージ編集済み 編集者: saki1208 編集日時 2008-03-04 12:47 ]

[ メッセージ編集済み 編集者: saki1208 編集日時 2008-03-04 12:50 ]
Teraterm
常連さん
会議室デビュー日: 2007/02/15
投稿数: 25
投稿日時: 2008-03-04 14:55
saki1208様

ご返答ありがとうございます。

>for コマンドを使用すればテキストファイルの行単位で
>処理することは可能です。

いろいろとFORを使ってためしてはいるのですが、どうしても要件を満たせるような
バッチが作れません。
それぞれの行を環境変数に格納することはできるのですが、同じ環境変数名でないとできないため、全て上書きされ、最終的に最後の行が格納されるようになってしまいました。
やはり、別の環境変数名で各行を格納することは難しいでしょうか?
みなと
大ベテラン
会議室デビュー日: 2002/06/14
投稿数: 202
お住まい・勤務地: Q州地方の日本海側
投稿日時: 2008-03-04 15:48
こんにちは
引用:

Teratermさんの書き込み (2008-03-04 14:55) より:
>for コマンドを使用すればテキストファイルの行単位で
>処理することは可能です。
それぞれの行を環境変数に格納することはできるのですが、同じ環境変数名でないとできないため、全て上書きされ、最終的に最後の行が格納されるようになってしまいました。
やはり、別の環境変数名で各行を格納することは難しいでしょうか?


よく状況がわからないのですが、回している同じタイミングで
入れる変数も変化させていけばいいのではないでしょうか?

ミニマムコードを提示してみてはいかがですか?
#コードはBBコードを使用するとインデント等きれいに表示できますです。



[ メッセージ編集済み 編集者: みなと 編集日時 2008-03-04 15:51 ]
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2008-03-04 15:57
どうしてもコマンドで行なう必要があるのでしょうか?
他に逃げ道は無いのでしょうか?
ぴよこ
ベテラン
会議室デビュー日: 2006/12/11
投稿数: 61
投稿日時: 2008-03-04 18:32
ネタですが、vbsで作ってみました。
環境変数名のA〜はどこから出てくるのでしょうか?

コード:

strText="a.txt"
dim ABC(25)
ABC(0)="A"
ABC(1)="B"
ABC(2)="C"
ABC(3)="D"
ABC(4)="E"
ABC(5)="F"
ABC(6)="G"
ABC(7)="H"
ABC(8)="I"
ABC(9)="J"
ABC(10)="K"
ABC(11)="L"
ABC(12)="M"
ABC(13)="N"
ABC(14)="O"
ABC(15)="P"
ABC(16)="Q"
ABC(17)="R"
ABC(18)="S"
ABC(19)="T"
ABC(20)="U"
ABC(21)="V"
ABC(22)="W"
ABC(23)="X"
ABC(24)="Y"
ABC(25)="Z"
set fso=CreateObject("Scripting.FileSystemObject")
if not fso.FileExists(strText) then wscript.quit
set objText=fso.OpenTextFile(strText)
lineCount=0
Do Until objText.AtEndOfStream
strLine=objText.ReadLine
if not strLine="" then lineCount=lineCount+1
loop
objText.Close

if lineCount=0 then wscript.quit
if lineCount>26 then wscript.quit

set shell=CreateObject("Wscript.Shell")
set WshEnvironment=shell.Environment("User")

set objText=fso.OpenTextFile(strText)
for i=0 to lineCount-1
wshEnvironment.Item(ABC(i))=shell.ExpandEnvironmentStrings(objText.ReadLine)
next
objText.Close
msgbox("END")



※編集したら勝手に1行ずつ改行が入った・・。

[ メッセージ編集済み 編集者: ぴよこ 編集日時 2008-03-04 18:38 ]
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2008-03-04 18:56
コード:
set count=1
for /f %%i in (test.txt) do @call :add %%i

exit /b

:add
	set a%count%=%1
	set /A count+=1



これでたぶんうごくと思う
Teraterm
常連さん
会議室デビュー日: 2007/02/15
投稿数: 25
投稿日時: 2008-03-07 11:03
皆さん

ご返答ありがとうございます。
何とか出来そうな感じです。

>ゆうじゅん様

いただきました内容で実施してみました。
環境変更名も不特定数で増えていき、理想のものとなりました。
1点分かりましたら教えて下さい。
------------------------------------
set count=1
for /f %%i in (test.txt) do @call :add %%i

exit /b

:add
set a%count%=%1
set /A count+=1

:aaaaa

SET Num=
SET/P Num="番号を入力して下さい%Num%: "
 ・
 ・
 ・

●頂きましたスクリプトの下に別のスクリプトを書いた場合、テキスト1行目を処理⇒下のスクリプトを実行⇒上のスクリプトで2行目を処理⇒下のスクリプトを実行という動きになってしまいます。
理想としましては、上のスクリプトがテキストの行数分を処理してから、下を(:aaaaa)処理するようにしたいのですが、お分かりになりますでしょうか?

いろいろと試したのですが、無知なものでなかなかうまくできません。

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

スキルアップ/キャリアアップ(JOB@IT)