テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す方法

このQ&Aのポイント
  • テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す方法について解説します.DOSの知識が必要になりますが,具体的な処理の記述やMATLABを利用した処理方法も紹介します.
  • 質問内容は2点あります.まず,「do @echo %a」という記述について理解が欲しいとのことです.また,よりスマートな記述方法についても検討しています.
  • MATLABを使用して直接この処理を行う方法についても知りたいとのことです.MATLABを介さずに処理を行う方法も解説します.
回答を見る
  • ベストアンサー

テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す

テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す方法についてです.DOSの知識は皆無なのでトンチンカンな質問でしたらご容赦ください. 処理内容は例えば, 001_20100601.txt 002_20106002.txt 003_20100604.txt という中身のfilename_list.txtから001,002,003だけを抜き出して, 001 002 003 という中身のid_list.txtを作りたいです.ネットで調べながら自分なりに考えてみて以下のような記述で処理できました. del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >>id_list.txt 質問は2点で,do @echo %a の意義(意味)というか処理内容が分からないので,それを理解したいということと,よりスマートな記述ができやしないかということです.前者についてはforの後には何らかの実行コマンドが必要だから無理やりつけている程度にしか理解できていません. よろしくお願いします. ※MATLABからコマンドプロンプトを動かして処理しているので,そんな回りくどいことしなくても,MATLABで直接この処理ができるようならその方法も知りたいです.

質問者が選んだベストアンサー

  • ベストアンサー
  • crossgate
  • ベストアンサー率65% (78/119)
回答No.3

>正確には「echo@に代わるコマンドは何かないか」と聞きたかったです. 残念ながら無いですね。 DOSのファイル追加書き込みは「>>」です。 そして、「>>」の左辺で、書き込む内容(今回のケースは変数「%a」)を標準出力に出してあげる必要があり、そのコマンドが「echo」です。 >前半で,aに値を格納し終わった後に, >「aを表示しない」という指令を出しているように見えて, tskskgtさんが気にしているのは、「@echo」って書くと「echo」をコメントアウトしてるように見えるということですか? (違うなら言ってください) もしそうであれば、標準出力にechoの結果が出てもいいなら単純に  del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do echo %a >> id_list.txt で良いです。 いやいや標準出力に出したくないから「@」を付けてるんだよ、ということであれば、強引(?)にこんな書き方もできます。 (1) echo off & del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do echo %a >> id_list.txt  コマンドプロンプト上では、これを実行した後に「echo on」を実行しないとプロンプトが戻ってこないのでやや難あり。  (&で連結して最後だけecho onできるんだろうか。。。?) (2) cmd /q /c "del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do echo %a >> id_list.txt"  プロセスを1個(cmdの分)立ち上げてしまうという難あり。 ですが、 >質問の意図としては,普段からDOSのプログラムを見てる人が見て >不自然ではないかということと,もっと直感的な理解するための >ヒントを得ることでしたので,あのような質問をしました. 普段からDOSのプログラムを見てる人にとっては、最初の  del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >> id_list.txt の方が直観的で分かりやすいんじゃないですかね? まあ、私ならid_list.txtが無い時に最初のdelコマンドがエラーになるのでこんな書き方します。  type nul > id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >> id_list.txt

tskskgt
質問者

お礼

重ね重ね丁寧な回答ありがとうございます. 初心者ながら大変よく理解できました. 私の理解が至っていなかった点は, >DOSのファイル追加書き込みは「>>」です。 >そして、「>>」の左辺で、書き込む内容(今回のケースは変数「%a」)を >標準出力に出してあげる必要があり、そのコマンドが「echo」です。 です.変数に値を格納した時点でそれがすぐ次の処理に使われる(今回の場合書き込まれる)内容として扱われると思っていたのでどうしてechoが必要なのかが分かっていませんでした. 同内容になりますが,「@」はコメントアウトを心配したのではなく,変数%aを扱える状態である(と勘違いしていた)のにわざわざ表示しないオプションを付けてまで変数%aを呼ぶ必要があったほかが釈然としなかったのです. >まあ、私ならid_list.txtが無い時に最初のdelコマンドがエラーになるのでこんな書き方します。 >type nul > id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >> id_list.txt ありがとうございます!自分でファイルを消しておきながら直後に作るのはどうもスマートな方法でないと思っていたのでこれでスッキリしました!crossgateさんがおっしゃるようにエラーも避けられますし,ぜひ使わせてもらおうと思います. 一応は処理できていましたが,恥を忍んで質問した甲斐がありました!! 本当にありがとうございます!!

その他の回答 (2)

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.2

>do @echo %a の意義(意味)というか処理内容が分からないので,それを理解したいということと forコマンドは、()で指定されたファイルに対してdo以降に書いたコマンドを実行する、という仕様です。 分解するとこんなイメージになります。 ・for /F "tokens=1 delims=_" %a in (filename_list.txt) do  filename_list.txtの各行から、"_"で区切った1個目の値を「%a」に格納してdo以降のコマンドを実行する(をファイルが終わるまで繰り返す)。 ・@echo %a >> id_list.txt  %aに格納された値をid_list.txtに追記する。 >前者についてはforの後には何らかの実行コマンドが必要だから無理やりつけている程度にしか理解できていません. 「@echo %a」(実際は「@echo %a >> id_list.txt」)は、tskskgtがやりたいという 「抜き出した値をファイルに書き込む」処理そのものです。 >よりスマートな記述ができやしないかということです. バッチだとこれが限界かと。

tskskgt
質問者

お礼

早速の回答ありがとうございます. 聞いたことには的確に答えて頂き,内容も理解できましたが, 質問内容が不十分でしたので,もしよろしければ追加で質問させてください. 正確には「echo@に代わるコマンドは何かないか」と聞きたかったです. 前半で,aに値を格納し終わった後に, 「aを表示しない」という指令を出しているように見えて, なんだか回りくどいというかベターな指令があるのでは? と思っています. 表現が適当かは分かりませんが,例えば「変数aをアクティブな状態にする」のような.

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.1

>DOSの知識は皆無なので 別にDOSの知識が無くてもトンチンカンの質問です。 まず、MATLABを使用しているなら、ここに投稿する事自体、意味不明な行動。本当にMATLABを使用しているのでしょうか? 普通ヘルプを見れば全てわかります。その程度の知識もなく、MATLABを使用しているのでしょうか? とりあえず、コマンドプロンプトを起動し、下記を実行してみてください。 >help コマンドのリストと概要がでますね。 > for /? forコマンドの説明がでています。何かキーを押すと次のページ移ります(パソコン初心者に見えるのでここまで説明) そこに書式がでています。つまりオプションが記載されていますね。 "do" 書式の一部です。do=何かを行う。と言う事で、それ以降何かの命令文を記述すると言う事ですね。 "echo"は >echo /? とすれば説明がでます。 以降なにか分からなければ、まずヘルプで検索。さらにネットで検索 検索例: ”DOS for リファレンス” それで分からない事だけを質問。パソコン初心者の、そこの君、わかったかな。

tskskgt
質問者

お礼

ご忠告ありがとうございます.

tskskgt
質問者

補足

忠告ありがとうございます. 初心者だということは否定しませんが,流石に挙げてくれていることはやりました. (だからこそ組めてます.) 質問の意図としては,普段からDOSのプログラムを見てる人が見て 不自然ではないかということと,もっと直感的な理解するための ヒントを得ることでしたので,あのような質問をしました. 簡単な質問だとは分かっていますが,周りに確認できる人間が おりませんので,ここに投稿しました.

関連するQ&A

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

    バッチファイルにてテキストファイルを一行読込みたいのですが、 「,」までの位置しか取得できません。 現状の該当箇所のコマンドと読込むテキストは以下になります。 [実行するコマンド] For /F "delims=" %%i in (read.txt) Do Call :Sub %%i :Sub set DATA=%1 echo %DATA% [読込むテキスト read.txt] "111","222","333","444" "111","222","333","444" [結果] "111" 結果の通り、カンマまでしか取得できていない状態です。 どなたかご教授の方、よろしくお願い致します。

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

    バッチファイルの中で、テキストを読み込んで、その中から 10文字分抽出する処理を行いたいのですが、テキストを変数に格納できません。 ヘルプ・ネットも見たのですが、やりかたが悪いのかできてない状況です。 何が悪いのかご教授お願いします。。 ↓ソース set testFile=test.txt For /F "delims=" %%i in (%testFile%) Do ( set readTxt=%%i set str=%readTxt:~10,10% echo %readTxt% echo %str% )

  • 【DOSコマンド】for の デリミタにダブルクォーテーションを使うには

    下記のような1行だけ書かれたテキストファイルがあり、その中からダブルクォーテーションで囲まれた部分を抜き出そうとしています。 --【abc.txt】----------------------------------------------------------- Command Line: "C:\Program Files\test\test.exe" ---ここまで------------------------------------------------------------- (C:\Program Files\test\test.exe を抜き出したい) DOSコマンドのfor文を使って抜き出そうとしたのですがダブルクォーテーションをどうやってデリミタに指定したらいいのかわかりません。   for /f 'delims=" tokens=2' %i in (test.txt) do @echo %i  とか   for /f "delims="" tokens=2" %i in (test.txt) do @echo %i など いろいろやってみたのですがエラーが出ました。 試しにテキストファイルのダブルクォーテーションを”+”に置き換えて試したところうまく出来たので、デリミタの指定の仕方だけだと思うのですが、どうしてもわかりません。 Command Line: +C:\Program Files\test\test.exe+   に対して for /f "delims=+ tokens=2" %i in (test.txt) do @echo %i はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • DOSコマンドバッチのFOR文の記述

    FOR文で以下のように記述しています。 SET FILENAME=aaa.txt FOR /F "tokens=1,2" %%i IN (revs.txt) DO SET FILENAME=%%i-%%j.txt & echo %FILENAME% echoで直前でSETした値を表示したいのですが、どうしても変化しません。(aaa.txtのまま) ※%i,%jには正しく値が設定されています。 以下を教えてください。 ・FILENAMEに値を設定する方法 ・コマンドが長い場合に改行する方法(もしあれば) よろしくお願いします

  • msdos for文 パスに!がある時の記述の仕方

    C:\test\dataのフォルダに入っているファイルの数と 最も古いファイルのファイル名は リスト1で取得できますが、 パスに!が入っているC:\test\!dataでは、 リスト2のようにしても、for文の所で、 指定されたファイルが見つかりません。 と表示されてしまいます。 パスに!が入っている時は、 どのように記述すればよいのでしょうか。 ---リスト1------------------------------------ @echo off set folder="C:\test\data\" for /F %%a in ('dir %folder% /a:-d ^| find "個のファイル"') do set num=%%a echo ファイルは %num% 個あります。 for /F %%F in ('dir %folder% /b /o:-d') do set filename=%%F echo 一番古いファイルは %filename% です。 ---リスト1の実行結果-------------------------- ファイルは 50 個あります。 一番古いファイルは test100.txt です。 ---------------------------------------------- ---リスト2------------------------------------ @echo off set folder="C:\test\!data\" for /F %%a in ('dir %folder% /a:-d ^| find "個のファイル"') do set num=%%a echo ファイルは %num% 個あります。 for /F %%F in ('dir %folder% /b /o:-d') do set filename=%%F echo 一番古いファイルは %filename% です。 ---リスト2の実行結果-------------------------- 指定されたファイルが見つかりません。 ファイルは 50 個あります。 指定されたファイルが見つかりません。 一番古いファイルは test100.txt です。 ---------------------------------------------- (実行環境 : Windows7のコマンドプロンプト)

  • DOSコマンドのFOR文で空白を含むファイルパスの指定方法

    DOSコマンドのFOR文で空白を含むファイルパスの指定方法 DOSコマンドのFOR文で、FORの繰り返し条件に 空白を含むファイルパスを指定する方法を教えてください。 やりたいことのイメージはこんな感じです。 for /f %%a in (C:\Documents and Settings\user\デスクトップ\list.txt) do ( echo %%a ) バッチファイルとlist.txtを同じディレクトリに配置し、かつ FOR文の前にCDを含めない事を条件にすれば 下記でもうまくいきます。 for /f %%a in (list.txt) do ( echo %%a ) 他のコマンドとの関係からこの前の処理で一度ディレクトリの 変更を行なう処理を含むため、FOR文で指定するファイルは 絶対パス指定をしたいと思っています。 簡単なことのような気もするのですが、 もしかしたら出来ないのかもしれないとも思っています。 FORの繰り返し条件に空白を含むファイルパスを 指定することはできるのでしょうか? 出来るのならばその方法を教えてください。 よろしくお願いします。

  • バッチファイル パス名に( )や!がある場合の対処

    2つのフォルダの配下にあるすべてのファイルが一致していることを確認する 下記のtest.batのプログラムでは、フォルダ名やファイル名の中に、 ()や!が含まれていない時は正しく動作しますが、 含まれていると正しく動作しません。 (問1) パスに( )が含まれている場合 (例)set x=C:\tmp\sample\DATA(1)_SP\   set y=C:\tmp\sample\DATA(2)_SP\ は、 echo !j:%x%=!>> list1.txt の所で 「_SP\ の使い方が誤っています。」 と表示されて正しく動作しませんが どのようにすればよいでしょうか。 (問2) echo !j:%x%=!>> list1.txt を echo !j:!x!=!>> list1.txt にすると、環境変数xの部分が空白に置き換わらないのですが なぜでしょうか。 (問3) パスに!が含まれている場合 (例)DATA1とDATA2の配下に!ABCというフォルダがある場合   C:\tmp\sample\DATA1\!ABC\… は、 for /F "delims=" %%i in (list01.txt) の取り出しの時に!が抜け落ちてしまい 以後の処理が正しく行えません。 !が抜け落ちないようにするには どのようにすればよいでしょうか。 よろしくお願いします。 ---test.bat---------------------------------------------- setlocal enabledelayedexpansion @echo off set x=C:\tmp\sample\DATA1\ set y=C:\tmp\sample\DATA2\ if exist list1.txt del list1.txt if exist list2.txt del list2.txt dir /b /s /a-d %x% > list01.txt dir /b /s /a-d %y% > list02.txt for /F "delims=" %%i in (list01.txt) do ( set j=%%i echo !j:%x%=!>> list1.txt ) for /F "delims=" %%i in (list02.txt) do ( set j=%%i echo !j:%y%=!>> list2.txt ) fc /n /w list1.txt list2.txt > result.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。" goto :EOF ) else ( if exist result.txt del result.txt ) set cnt=1 set err_cnt=0 for /F "delims=" %%i in (list1.txt) do ( set /p<NUL=[!cnt!] fc /n /w "%x%%%i" "%y%%%i" >> nul if ERRORLEVEL 1 ( echo [!cnt!] %x%%%i >> result.txt fc /n /w "%x%%%i" "%y%%%i" 2>&1 >> result.txt set /a err_cnt=!err_cnt!+1 ) set /a cnt=!cnt!+1 ) echo; if %err_cnt%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="%err_cnt% 個が一致しませんでした。" ) ------------------------------------------------- 【動作環境】Windows7 コマンドプロンプト(Ver.6.1.7601)  

  • テキストの読込について

    あいうえお かきくけこ さしすせそ ↑のような中身のテキストファイルを読み込んで、 あいうえおかきくけこさしすせそ ↑のように、改行をなくして新規テキストに出力する プログラムを作成中なのですが、上手くいかず 困っています。 改行を無視した取り込みは出来るのでしょうか? もしくは、LineInput等で読み込んだ後、 改行を取り除くような処理をするのでしょうか? 下記は、現在まで作ったプログラムなのですが、 これだと、改行も同時に取り込んでしまっています。 Private Sub Command1_Click() Dim sData As String Dim FileName As String CommonDialog1.Filter = "テキスト|*.txt|全てのファイル|*.*" CommonDialog1.ShowOpen FileName = CommonDialog1.FileName Open FileName For Input As #1 Do Until EOF(1) Line Input #1, sData Loop Close #1 環境は、WindowsXP、VB6.0エンタープライズです。 以上、宜しくお願い致します<(_ _)>

  • テキストファイルに情報を格納したい。上手に動作せず

    数百ページの各ページの特定部分の情報をテキストファイルに格納するものを作りたいのです。 テキストファイルを作るところまではできたのですが、上手にできません。 初めてページを開くなら情報の新規作成、2回目以降であれば上書きしたいです。 なにが原因で動かないのでしょうか。 <?php $filename = "samplefile.txt"; $page_list = file($filename); //-------------------------------- //手入力で内容を更新するエリア //-------------------------------- $url = 1 ."page.php"; //現在開いているページ。http://test.com/236page.phpなどのようになる $h1DATE = "タイトルテスト"; $imgDATE = "img/sample.jpg"; //全てのページで固定 $comeDATE = "これはテストです。"; //-------------------------------- $lines = $url."|".$h1DATE."|".$imgDATE."|".$comeDATE."\n"; //samplefile.txtに追加する行 $fp = fopen($filename, "a"); $file = file_get_contents($filename); //ファイルを全て文字列として取得 $text = explode("\n",$file); //\nを元に行を分けて配列に格納 for($i = 0; $i <= count($text) - 1; $i++){ if(ereg($url,$text[$i]) || ereg($h1DATE,$text[$i]) || ereg($imgDATE,$text[$i])|| ereg($comeDATE,$text[$i])){ $text[$i] = ""; //このページの$url、$h1DATE、$imgDATE、$comeDATEのどれかに一致するものはその行を削除 } } $text[count($text)] = $lines; fwrite($fp, $text[count($text)]); fclose($fp); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ページ1</title> </head> <body> <div id="main"> <h1><?php echo $h1DATE ?></h1> <?php echo '<img src="'.$imgDATE.'" id="imgID" />' ?> <p id="comeID"><?php echo $comeDATE ?></p> </div> </body> </html>

    • ベストアンサー
    • PHP
  • Windows バッチを Linux へ移植したい

    FOR 文を使ってテキストファイルの中身を変数に格納するバッチファイルがあります。 FOR /F "tokens=1,2* delims==" %%i IN (test.txt) DO SET %%i=%%j [読み込む test.txt の内容] HOGE=A FUGA=B HAGE=C 実行すると、%HOGE% には A、%FUGA% には B、%HAGE% には C が代入されます。 これと同じ処理を Linux のシェルスクリプト(bash)で実現するにはどうすれば良いでしょうか。 while read ~ でやるのかなと思ったのですが、変数の処理がピンと来なくて困っています。 どうかご教授ください。