質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

405閲覧

forループでテキストデータどうしのペアを作るバッチファイル

tkp345

総合スコア7

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2018/04/10 02:30

編集2018/04/10 04:12

1列の数字が入っている、2つのテキストデータでペアになっているものを選び出すバッチファイルを作りました。
しかし一晩たっても処理が終わらないのでなにか不具合があるように思いますが、プログラミング初心者のため知識不足で何が悪いのかが分かりません。

意図としてはdata1.txtから1行ずつ%%aに取得し、data2.txtと一行ずつ比較し、イコールであればその数字を吐き出す。それをdata1.txtの最後の行まで繰り返すというイメージで書いております。

for /f %%a in (data1.txt) do (
for /f %%b in (data2.txt) do (
if %%a==%%b echo %%a >> pair.text
)
)

勉強不足がゆえにこのような質問をして申し訳ございませんが、問題点をご指摘いただきたいです。
また恐縮ではございますが、この方針で目的を達成できないようでしたら、awk,C++でしたら現在勉強中なのでこの二つでプログラムを書くための助言を頂けますと幸いです。
どなたかお力を貸していただきたいです。
うまく説明できているか怪しいですが、どうぞよろしくお願いいたします。

追記 

コメントありがとうございます。
データの一部を抜粋しておりますがdata1.txt、data2.txt共に、以下のように6または5つの数字を一列に詰め込んだ形のテキストデータからなっています。

200579
200581
200582
200586
52155
52157
52167
52168
52192

確認したところ、空白やtabは含まれておりませんでした。
また、pair.textのファイルサイズは、処理が終わらなかったため途中で止めたものですが、もとのdata1.txtと比べてもそれほど大きくはなっておりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2018/04/10 03:10

data1.txt、data2.txtには、どのような内容が入っているのでしょうか? また、pair.textのファイルサイズは大きくなっていってますか?
coco_bauer

2018/04/10 03:12

data1.txt、data2.txtに空白やタブが含まれているために起きているトラブルではないかと疑っています。
coco_bauer

2018/04/11 08:18

”if %%a==%%b echo %%a >> pair.text”の部分は、(data1.txtのデータ数) × (data2.txtのデータ数) 回実行されます。データ数が多ければ、終わるまでに長い時間がかかります。 何回ぐらい実行するようなデータを使っているのですか?
guest

回答2

0

動作確認していませんがたぶん以下のような感じで達成できるのではないかと思います。

test.awk:

BEGIN{ while((getline x < "data2.txt") >0) n[x]++ } { if($0 in n) print }

そして以下を実行。

awk -f test.awk test1.txt

投稿2018/04/10 05:59

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkp345

2018/04/12 09:36 編集

提示していただいた方法ではなぜかエラーが出てしまいできませんでしたが、回答ありがとうございました。 無事解決することができました。
guest

0

ベストアンサー

回答ではありませんが、

bat

1a.bat 2 3@echo off 4for /f %%a in (data1.txt) do ( 5rem for /f %%b in (data2.txt) do ( 6rem if %%a==%%b echo %%a >> pair.text 7rem ) 8 echo %%a 9) 10 11data1.txt 12 131 2 3 4 5 146 7 8 9 10 1511 12 13 14 15 16 1617 18 19 20 21 22 23 24 25 26 17

これを走らせてみると、

1
6
11
17

となります
質問の修正欄でもおっしゃられていますが、これではダメそうですね


質問の追記による追記

こちらで、質問に書かれているコードで簡単な十数行のファイルをそれぞれ作って実行してみたところ、想定したファイルがちゃんと出来ているようです

んで、元のコードでは data1.txt の取得した行数の回数分、data2.txt をアタマから読み込む(該当がなければ全行)ような動作となってしまっているため、それぞれのデータファイルの行数が大きい場合に実行時間が増大してしまうことだと思われます

まあ、ここはAWKでもいいですが、最初に双方のファイルを内部の配列などに読み込んでしまい、内部動作だけで一致行を抽出するような動作にしたほうがいいんじゃないかと思います

投稿2018/04/10 04:00

編集2018/04/10 05:03
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkp345

2018/04/12 09:36

おっしゃる通り配列に詰め込んで、forループによって比べる方法をC++でプログラミングしたところ無事思い通りの結果を出すことができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問