[前の記事]« フルパスからフォルダ名を取り出して環境変数に代入するには
[次の記事]NET START/STOPのメッセージを抑制したい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ

テキスト内への複雑な条件つきでの文字列追加処理

626.
テキストファイルに文字列追加
2005年07月21日(木) 22時32分
黎欄◆CPZattg=
win2000を使用しています

Aと言う名前のフォルダに、複数のTEXTファイルが有り
その複数あるTEXTファイルの文字列(文章)に、複数あるBBと言う文字がある行の初めに、
上から順に、C001・C002・C003・C004・・・ と言う用に上から順に番号を付けて、
その後ろに、決まった文字DDDを入れるようなコマンドは作成可能ですか?
可能であれば教えて頂けないでしょうか

下記は、ファイルの中身の■変換前、■変換後です

FFFKKKKK
GGGBBXXX
HHHJJJJJ
LLLLMMMM
NNNNOOBB
PPPPPPPP
QQQBBRRR
SSSTTUUU


FFFKKKKK
C001DDDGGGBBXXX
HHHJJJJJ
LLLLMMMM
C002DDDNNNNOOBB
PPPPPPPP
C003DDDQQQBBRRR
SSSTTUUU
627.
Re:テキストファイルに文字列追加
2005年07月22日(金) 12時32分
otn
>win2000を使用しています
>
>Aと言う名前のフォルダに、複数のTEXTファイルが有り
>その複数あるTEXTファイルの文字列(文章)に、複数あるBBと言う文字がある行の初めに、
>上から順に、C001・C002・C003・C004・・・ と言う用に上から順に番号を付けて、
>その後ろに、決まった文字DDDを入れるようなコマンドは作成可能ですか?
>可能であれば教えて頂けないでしょうか
>
>下記は、ファイルの中身の■変換前、■変換後です
>■
>FFFKKKKK
>GGGBBXXX
>HHHJJJJJ
>LLLLMMMM
>NNNNOOBB
>PPPPPPPP
>QQQBBRRR
>SSSTTUUU
>↓
>■
>FFFKKKKK
>C001DDDGGGBBXXX
>HHHJJJJJ
>LLLLMMMM
>C002DDDNNNNOOBB
>PPPPPPPP
>C003DDDQQQBBRRR
>SSSTTUUU

ファイルの中身が英数字程度しかないのなら出来ると思います。記号 " < > ^ 等もありえるなら難しいか、記号によっては出来ないでしょう。
あと、BB が含まれるという条件は大文字小文字を区別しなくてもよいですか?bbやBb、bBを含む行も対象にしてよいかと言うことです。
628.
Re:テキストファイルに文字列追加
2005年07月22日(金) 17時47分
黎欄
otn様 
ご返答有難う御座います

説明不足で申し訳ありません

>ファイルの中身が英数字程度しかないのなら出来ると思います。
ファイルの中身は基本的には英数字です
初めの方に10行くらいカッコ()の中に日本語と記号の / - _ があります

(あいうえお/アイウエオ-亜意卯_絵尾)
(かきく_けこ-カキクケコ/課気区毛子)
(さしすせそ/サシ_スセソ-差氏巣背祖)
FFFKKKKK
GGGBBXXX
HHHJJJJJ
LLLLMMMM
NNNNOOBB
PPPPPPPP
QQQBBRRR
SSSTTUUU

>記号 " < > ^ 等もありえるなら難しいか、記号によっては出来ないでしょう。
記号 " < > ^はありませんが( ) / - _ はあります

>BB が含まれるという条件は大文字小文字を区別しなくてもよいですか?bbやBb、bBを含む行も対象にしてよいかと言うことです。
BBと書きましたが英数字の大文字一文字です

宜しくお願いします。
629.
Re:テキストファイルに文字列追加
2005年07月22日(金) 18時41分
otn
>otn様 
>ご返答有難う御座います
>
>説明不足で申し訳ありません
>
>>ファイルの中身が英数字程度しかないのなら出来ると思います。
>ファイルの中身は基本的には英数字です
>初めの方に10行くらいカッコ()の中に日本語と記号の / - _ があります
>
>(あいうえお/アイウエオ-亜意卯_絵尾)
>(かきく_けこ-カキクケコ/課気区毛子)
>(さしすせそ/サシ_スセソ-差氏巣背祖)
>FFFKKKKK
>GGGBBXXX
>HHHJJJJJ
>LLLLMMMM
>NNNNOOBB
>PPPPPPPP
>QQQBBRRR
>SSSTTUUU
>
>>記号 " < > ^ 等もありえるなら難しいか、記号によっては出来ないでしょう。
>記号 " < > ^はありませんが( ) / - _ はあります
>
>>BB が含まれるという条件は大文字小文字を区別しなくてもよいですか?bbやBb、bBを含む行も対象にしてよいかと言うことです。
>BBと書きましたが英数字の大文字一文字です
>
>宜しくお願いします。

大文字小文字を区別する必要があるということですね。
以下で出来ると思います。
なお、空行は処理出来ないので削除されます。

@echo off
cd \A
for %%F in (*.txt) do (
 set CNT=1000
 copy nul out.tmp >NUL
 for /f "delims=" %%A in (%%F) do call :sub "%%A"
 move out.tmp %%F
)
goto :eof
:sub
echo %~1 | find "BB" >NUL
if %ERRORLEVEL%==0 goto bb
 echo %~1>>out.tmp
 goto :eof
:bb
set /a CNT+=1
echo C%CNT:~-3%DDD%~1>>out.tmp
630.
Re:テキストファイルに文字列追加
2005年07月23日(土) 08時27分
黎欄
otn様 
有難う御座います

書き忘れていたのですが、

特定の文字列がすでに記入されている場合、「既に記入済みです」とポップアップで表示をさせOKボタンを押して終了させたいのですが可能でしょうか?

よろしくお願いします
633.
Re:テキストファイルに文字列追加
2005年07月25日(月) 15時52分
otn
>otn様 
>有難う御座います
>
>書き忘れていたのですが、
>
>特定の文字列がすでに記入されている場合、「既に記入済みです」とポップアップで表示をさせOKボタンを押して終了させたいのですが可能でしょうか?
>
>よろしくお願いします

ボップアップを出すのは、vbscript等を使わないといけませんが、目的を考えると、PAUSEコマンドでもよさそうなので、それを使うようにしてみました。
「特定の文字列がすでに記入されている場合」というのは、行頭に「C001DDD」があるという風に判断しています。

@echo off
cd \a
for %%F in (*.txt) do call :file %%F
goto :eof
:file
findstr /b "C001DDD" %1 >NUL
if %ERRORLEVEL%==0 (
 echo %1 は既に記入済みです
 pause
 goto :eof
)
set CNT=1000
copy nul out.tmp >NUL
for /f "delims=" %%A in (%1) do call :sub "%%A"
move out.tmp %1
goto :eof
:sub
echo %~1 | find "BB" >NUL
if %ERRORLEVEL%==0 goto bb
 echo %~1>>out.tmp
 goto :eof
:bb
set /a CNT+=1
echo C%CNT:~-3%DDD%~1>>out.tmp
634.
Re:テキストファイルに文字列追加
2005年07月26日(火) 05時54分
黎欄
otn様 

無事変換出来る様になったのですが、肝心な事を言い忘れていました。m(_ _;)m 
本日、私が使用しているファイルで変換実行したところ、余りにも時間がかかる為、途中で変換を断念しました。

私の変換しようとしているファイル(TEXT)は10万行以上もあるため、行数の少ない場合はotn様 に教えて頂いた変換方法で数秒で可能なのですが、行数が多い場合時間がかかりせっかく教えて頂いたのですが使用できませんでした

丁寧に教えて頂きとても勉強になりました。
ありがとうございました。
636.
Re:テキストファイルに文字列追加
2005年07月26日(火) 17時27分
otn
>otn様 
>
>無事変換出来る様になったのですが、肝心な事を言い忘れていました。m(_ _;)m 
>本日、私が使用しているファイルで変換実行したところ、余りにも時間がかかる為、途中で変換を断念しました。
>
>私の変換しようとしているファイル(TEXT)は10万行以上もあるため、行数の少ない場合はotn様 に教えて頂いた変換方法で数秒で可能なのですが、行数が多い場合時間がかかりせっかく教えて頂いたのですが使用できませんでした
>
>丁寧に教えて頂きとても勉強になりました。
>ありがとうございました。

"BB"が大文字小文字区別しなくて良いなら、
echo %~1 | find "BB" >NUL
if %ERRORLEVEL%==0 goto bb

set X=%~1
if not "%X%"=="%X:BB=%" goto bb
に変えれば数倍早くなると思います。

それにしても10万行だと待てないかもしれませんね。awkとかperl,ruby,vbscript等のスクリプト言語を使うか、Cでプログラムを書くか。
637.
Re:テキストファイルに文字列追加
2005年07月26日(火) 19時24分
イルカ
黎欄さん、イルカです。

>私の変換しようとしているファイル(TEXT)は10万行以上もあるため、行数の少ない場合はotn様 に教えて頂いた変換方法で数秒で可能なのですが、行数が多い場合時間がかかりせっかく教えて頂いたのですが使用できませんでした

 なんかSEDかAWKの世界のような??
「sedは日暮れて」
http://www.chimimo.com/sed/
AWKの第一歩
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/
639.
Re:テキストファイルに文字列追加
2005年07月27日(水) 18時02分
黎欄
otn 様 イルカ 様
色々ありがとうございます

スクリプト言語という物を覚えないと出来ないみたいですね(^-^;) 

全然なにがなんだか分かりませんが少しずつ覚えていきたいと思います
リンクまで貼って頂きありがとうがざいました
664.
Perlで申し訳ないが・・
2005年08月02日(火) 00時42分
イルカ
黎欄さん、イルカです。
 ちょっと暇なので、activePerlで、
activePerlの入手先は下記などを参考に
Perlのインストール
http://www.dream-seed.com/server/perl.html
 
_____________________________
#!/usr/local/bin/perl
open OUT ,">>./list.txt"; #list.txtをOUTというハンドルで開く
$i = 1;                   #$iに1を代入
$Long = 8;                #1行の長さを8文字に
@CAT = ('A','B','C','D','E','F','G','H','I','J','K','L',
        'M','N','O','P','Q','R','S','T','U','V','W','X',
        'Y','Z','1','2','3','4','5','6','7','8','9','0'
);#使用する文字

$MAX = $#CAT; #使用する文字の数を取り出して

while( $i < 100000){ #100,000まで
 undef $line;                # $lineを初期化して
 foreach ( 0..$Long){        # 桁数回処理
  $charNum = int ( rand $MAX); # 乱数
  $line .= $CAT[$charNum];     # 何番目の文字か
 }
 print OUT "$line\n";           # ファイルに追記
 $i ++;
}
close OUT;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 これで、100,000行のデータを作って(1秒の半分)
______________
#!/usr/local/bin/perl

open (LIST,"<./list.txt");
open (OUT,">>listOut.txt");

$keyword = 'DDD';                # キーワード
$i = 0;
$Moji = 'Y';                     # 探す文字
while(<LIST>){                   # 1行ずつ処理
  if ( /$Moji/ ){                # パターンマッチ
    $i++;
    $j = sprintf ("%04d",$i);    # 0023 にする
    $line = $j.$keyword.$_ if /$Moji/; # 連結
  }
  else{
    $line = $_;
  }
  print OUT "$line";
}
close LIST;
close OUT;
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 で処理、こちらは・・・1秒どころか、一瞬で終わった

結果
______________list.txt
WVPX1YP5P
ZWK465QWD
HL3ANNTJO
UIVU5TCXG
2QVCFVSQW
VAZUSJALQ
GRBEM2MHO
6VZEOPF28
ZGTTHLLKJ
RIR1BCFQU
IWV8YTDDS
QRWW2TO9K
X9BXU1BLZ
DGILPA4N2
URNJ9MO3Y
EI6LHYXLU
PW75TBRAH
B6ZZ1HUB2
81KUP5RZV
T1OICAAXG
 以下略

_______listOut.txt
0001DDDWVPX1YP5P
ZWK465QWD
HL3ANNTJO
UIVU5TCXG
2QVCFVSQW
VAZUSJALQ
GRBEM2MHO
6VZEOPF28
ZGTTHLLKJ
RIR1BCFQU
0002DDDIWV8YTDDS
QRWW2TO9K
X9BXU1BLZ
DGILPA4N2
0003DDDURNJ9MO3Y
0004DDDEI6LHYXLU
PW75TBRAH
B6ZZ1HUB2
81KUP5RZV
T1OICAAXG
 以下略
665.
一応、注意事項とか
2005年08月02日(火) 00時52分
イルカ
イルカさん、イルカです。

 Windowsだと、文字こーどがShift.jisなので、半角英数字は日本語の文字コードと衝突するでしょう。

 詳しくは、他の掲示板で・・・

 文字列処理が多いなら、perlぐらいはなければ・・
679.
Re:色々ありがとうございました。
2005年08月03日(水) 19時34分
黎欄
イルカ 様

まだ変換実行はしていませんが、activePerl&イルカ 様に教えて頂いた処理で実行すれば変換がとても早そうですね。
activePerlについて、少し勉強してみます
色々教えて頂きありがとうございました。
680.
Re:色々ありがとうございました。
2005年08月03日(水) 23時10分
イルカ
黎欄さん、イルカです。

 テキスト処理なら、SED(ストリームエディタという名前どおり早い)とかAWKという手よりも、汎用性、資料の数から今はPerlのほうがよいかもしれません。(よいでしょう)

 特に、強力な正規表現と、プログラムの理解しやすさ・・自然言語・・英語に最も近いかも・・、豊富なライブラリは秀逸でしょう。

 if( $a == $b){ 処理 }
と日本語風にも
 処理 if $a == $b 
と英語風にも書ける。・・・それを嫌う人も居るけど。

 私は、@home@homepageでサイトを持っているため、そのテスト環境を作るため、apacheやCYGWIN(UNIXのツールをWindowsに移植したもの・・SEDやAWK、Bashやshといったシェル)と共に使う必要からドライブ:\usr\local にPerlをインストールしていますが、その必要がないならデフォルトのインストール先(C:\Program Files\perl)でよいでしょう。

 先のプログラムが速いのは、ファイルを読みメモリーに保存することなく1行ずつ処理して、別の出力ファイルに追記しているため、瞬時に処理が行われるからです。10万行程度なら瞬時に終わるでしょう。

 テキストの処理が多いなら、このようなスクリプト処理言語はとても使いやすいでしょう。Perlでバッチファイルみたいなものを作っておいて、DOS窓から
> perl ./test.pl 
 で処理されます。
> perl -c ./test.pl
 で記述ミスのテスト・・デバッガ
 
 


カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2005年07月21日 11:59に投稿されたエントリーのページです。

ひとつ前の投稿は「フルパスからフォルダ名を取り出して環境変数に代入するには」です。

次の投稿は「NET START/STOPのメッセージを抑制したい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート