「夫を成功」へ導く妻の秘訣 座談会

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

A 回答 (4件)

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?



findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。
    • good
    • 4
この回答へのお礼

うーんファイルの先頭に3が来る可能性はありますね。コマンドプロンプトに慣れてなく、あまり複雑だとわからないのです・・・別の方法も考えてみます

お礼日時:2013/10/14 20:47

No1, 2 さんが指摘しているようにちょっと趣旨がわからない。



>for /?

で見れば、わかるような話。とは言え、ランダムに行を表示したときは more コマンドで行数を指定すればいい。抜き出したいときは、適当なコマンドが標準では見つからない。で、

--- a.bat --------------------------------
@echo off
setlocal

set > a.txt

rem 3行目を line 変数にセット。

call :PicUp1 "3" "a.txt"
echo line=%line%

call :PicUp2 "3" "a.txt"
echo line=%line%

goto :EOF

:PicUp1
set /a No="%~1-1"
for /f "usebackq skip=%No% tokens=* delims=" %%a in (`findstr /n /r "." %2`) do (
set line="%%a"
exit /b 0
)
goto :EOF

:PicUp2
set /a No="%~1-1"
for /f "usebackq skip=%No% tokens=1,* delims=:" %%a in (`findstr /n /r "." %2`) do (
set line="%%b"
exit /b 0
)
goto :EOF

endlocal
------------------------------

などと擬似ユーザー定義関数を作るしかない。これで行数指定でピックアップできる。
    • good
    • 2
この回答へのお礼

なんとかいていただけましたか。バッチ作ってみましたが、上手くゆきません。うーんしかし自分には理解が難しい感じです。

お礼日時:2013/10/14 20:35

本文を見る限りだと「任意の行」じゃなく「各行」に思えるんですが。


もしそうなら単にFORでできますがどうでしょうか。
https://www.google.com/search?q=%E3%83%90%E3%83% …
    • good
    • 0
この回答へのお礼

うーん任意だと思います。どこかを"1"とすれば1行目のみの読み込み、"3"とすれば3行目のみの読み込みがしたいです。実際はその数字の部分を変数に置き換え、処理が終わる事に+1加算していくつもりです。検索トップの下記リンクは行いましたが、これは単純に読み込むテキストファイルの各行全て表示されてしまいます。
http://ameblo.jp/mixtest/entry-10575297208.html

お礼日時:2013/10/14 19:11
    • good
    • 0
この回答へのお礼

そちらのサイトの方法も行ったのですが、どうもできないです…1行目のみの取得はできたと思いますが、2行目以降の取得はどうすればいいのかわからないです。

お礼日時:2013/10/14 19:14

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

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

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

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

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

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

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qtxtファイルから特定の文字列が書かれた行だけを取得や削除するソフト

txtファイルで
特定の文字列が書かれた行だけを
取得や削除するソフトや方法を探しています。
フリーで無いなら、シェアウェアなどになってもかまいません

例えば
(12)と書かれた文字列がある行だけを抜きだしたり
逆に(12)と書かれた文字列がある行だけを削除したり
したいです。

そのソフトの操作方法も教えてくださると助かります。

では、回答を心よりお待ちしております。

Aベストアンサー

NoEditor
http://www.vector.co.jp/soft/winnt/writing/se300436.html

というフリーのテキストエディタをインストールすると、YokkaGrepというソフトがセットでインストールされます。

検索ディレクトリ、検索文字列(正規表現も可)、ファイル名(ワイルドカードで複数のファイルの検索も可)などをセットして検索できます。

検索結果をテキストファイルやcsvファイルに出力することや、検索文字列を含む行を削除などの機能もあります。

grepで検索すると、他にも似たような機能のソフトがあると思いますが、NoEditor付属のYokkaGrepは、お勧めです。

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

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

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

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

Aベストアンサー

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

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

区別するなら、

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

Qテキストファイルから最終行の抽出

テキストファイルに出力された内容のうち、
最終行のみ抽出し、他のテキストファイルに
落とし込みたいと考えています。

DOSコマンドを使用して実現したいと思うのですが
良い方法などございましたら、ご教授ください。

宜しくお願い致します。

※OSはWindows Server 2003を使用しています。

Aベストアンサー

98SEから2003までのすべてのWindowsに標準搭載されているコマンドでFORと>(リダイレクト)を使って出来ます。

FOR /F "TOKENS=1*" %A IN ([元ネタファイル名]) DO ECHO %A > [出力先ファイル名]

 (大カッコ([ ])は必要ありませんが、普通のカッコ( () ) は必要です。)

 元ネタのファイルサイズが大きかったら少々思い処理になるかもしれませんが、所詮テキストファイルですので、極端に時間がかかるものでもないでしょう。

 なお、元ネタのファイルはSVS形式などのファイルだと思いますが、そうだとするとフィールドの区切り文字をそのデータ内に含まれないものにするといいですね。FORのなかに" "で囲まれた部分がありますが、そこに 「delims=...」などとデータ内に無い文字列を指定します。"TOKENS=1* delims=..."というようにTOKENSとはスペース区切りで追加します。
(今回、元ネタのデータがどういうものか分からないのではっきりとした答えを書きようがありません。データの形式によっては例外処理対応をする必要もあります。

 バッチで組むならもっと軽くする方法はありますね。なお、その際、FORの内部変数を%%Aとする必要がありますので気をつけましょう。今回はコマンドラインでということですので、コマンドライン1行で出来るものとしています。

98SEから2003までのすべてのWindowsに標準搭載されているコマンドでFORと>(リダイレクト)を使って出来ます。

FOR /F "TOKENS=1*" %A IN ([元ネタファイル名]) DO ECHO %A > [出力先ファイル名]

 (大カッコ([ ])は必要ありませんが、普通のカッコ( () ) は必要です。)

 元ネタのファイルサイズが大きかったら少々思い処理になるかもしれませんが、所詮テキストファイルですので、極端に時間がかかるものでもないでしょう。

 なお、元ネタのファイルはSVS形式などのファイルだと思いますが、そう...続きを読む

QDOSバッチにて外のファイルの指定行を読む

今回、皆様の助けを頂き、DOSバッチを作成して仕事をやることができました。
感謝します。しかしながら、入出力に関して、もう少し理解したいと思います。
特に、外のファイルの指定行の内容を読み出すことはできないでしょうか?

外のファイルの最初の行を読み出す
@echo off
set /p abc=< c:\mylog.log
echo %abc%

外のファイルの最後の行を読み出す
@echo off
FOR /F "delims= " %%a IN (c:\mylog.log) DO (set abc=%%a)
echo %abc%

-----------
DOSのHelpを調べてみましたが、
For のパラメータについて、よく理解できていません。
パラメータをうまく使えば、ファイルの指定行を読み出せる気がするのですが、
調べ切れていません。

宜しくお願いします。

Aベストアンサー

こんにちは。前回も回答したM_Satoです。
前回と同じような内容になりますが……

内部コマンドだけで処理せず、外部コマンドとしてsed.exeを導入すれば、テキスト・ファイルの処理に自由度が出てきます。

●使用例
1)1行目を読み出す場合
c:\sed -ne "1p" c:\mylog.log > oneline.txt

2)5行目を読み出す場合
c:\sed -ne "5p" c:\mylog.log > oneline.txt

3)最後の行を読み出す場合
c:\sed -ne "$p" c:\mylog.log > oneline.txt

●sed のオプションの説明
-n ……標準出力を抑制する(sedは入力ファイルを1行ずつ読んで(編集後に)標準出力に吐き出します。このオプションをつけると、出力コマンドがある場合に限り出力します)
-e ……うしろに記述されているコマンドを実行する。
-f ……うしろに記述されているファイルの内容をスクリプトとして実行する。

●コマンドの説明
1p……1行目を出力する
5p……5行目を出力
$p……最後の行を出力する
行数はバッチファイルの引数%1で与えてもかまいません。

●出力方法
いずれもoneline.txtに1行だけ出力しますから、あとは
type oneline.txt
として画面に出力してもいいし、
下記のようにいったん変数に取り込んでから出力してもいいでしょう。
set /p abc=<oneline.txt
echo %abc%

●導入
sed.exeはストリームエディタというDOSのソフトで、下記からダウンロードして解凍したあと、sed.exeだけをc:\に置いてください。特にインストール作業は必要ありません。
http://www.vector.co.jp/soft/dos/util/se000880.html
(sed.exeはさまざまな開発者によって発表されており、いろいろな版がありますが、上記のものが使いやすいと思います)

なお、入力ファイル名は旧DOSの規則に従って半角換算で8文字以内+拡張子3文字以内にしてください。

こんにちは。前回も回答したM_Satoです。
前回と同じような内容になりますが……

内部コマンドだけで処理せず、外部コマンドとしてsed.exeを導入すれば、テキスト・ファイルの処理に自由度が出てきます。

●使用例
1)1行目を読み出す場合
c:\sed -ne "1p" c:\mylog.log > oneline.txt

2)5行目を読み出す場合
c:\sed -ne "5p" c:\mylog.log > oneline.txt

3)最後の行を読み出す場合
c:\sed -ne "$p" c:\mylog.log > oneline.txt

●sed のオプションの説明
-n ……標準出力を抑制する(sedは入力ファイルを1...続きを読む

Qバッチファイル 文字列にスペースがある場合

for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\

これはcドライブのa aaというフォルダ名の中を検索するコードですが、
フォルダ名にスペースがあるため、うまく動きません。

"a aa"のように""で囲ってみましたが、駄目でした。

どうすれば良いのか、教えていただきたいので、お願いします。

Aベストアンサー

for /f %%A in ('dir /b /s c:\"a aa"\*.pdf') do echo copy "%%A" D:\
のようにecho でどのようなコマンドが実行されているか確認しましょう。

この記述ではdirコマンドで表示されるパスの中に空白があるため %%A には空白までの文字列しか代入されません。
以下のように修正して試してみてください。

for /f "delims=" %%A in ('dir /b /s c:\"a aa"\*.pdf') do copy "%%A" D:\

Qbatファイル処理でのテキストファイルの内容を編集

batファイル処理のみにてテキストファイルの内容を編集する事は可能でしょうか。

例えば
aaa=0
bbb=0
ccc=0
ddd=0

という内容のテキストファイルが存在し、batファイルにて
aaa=0
bbb=1
ccc=1
ddd=0

というように、指定行の内容を変更させたいのですが、この処理をbatファイルのみで行う事は可能でしょうか。

宜しくお願いします。

Aベストアンサー

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
objFile.Close
strText = Replace(strText, "bbb=0", "bbb=1")
strText = Replace(strText, "ccc=0", "ccc=1")

Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.WriteLine strText
objFile.Close
----- replace.vbs ここまで -----

参考URL:http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
obj...続きを読む

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む

Qコマンド実行結果を環境変数に代入する方法ありますか

下記のとおりfindコマンドを実行すると結果が表示されます。
findコマンドの実行結果を直接環境変数に代入したいのですが、
できますでしょうか。
できれば「5」だけを環境変数に代入したいです。
よろしくお願いします。

C:\tmp>find /C "OPEN" aaa.txt

---------- AAA.TXT: 5

Aベストアンサー

バッチファイルとして書くならこんな感じですね。

@echo off

for /f "tokens=3 delims= " %%a in ('find /C "OPEN" aaa.txt') do set RESULT=%%a

echo [%RESULT%]

Qバッチファイルで2つ以上の変数を連結し、1つの変数にしたい。

Windows2000でバッチファイルを作っています。
バッチファイルが受け取る2つのパラメータを %1 %2とすると、
それを連結して、新たな変数 A を作りたいのですが、どのようにすれば良いのでしょうか。

Aベストアンサー

SETで変数にパラメータをセットすればOKだと思います。

例)
SET A=%1%2
echo %A%


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング