• ベストアンサー

この置換処理について

以下の処理がうまくいきません。 perlで実行すると以下の置換を行ってテキストファイルができるはずなのですが、0KBのテキストファイルができてしまいます。 そこで、手動で置き換えようと思ったのですが。 正規表現を使用した、置換処理を行っているということはわかっているのですが中の処理が分かりません。 詳しい処理の内容を教えていただけないでしょうか。 よろしくお願いいたします。 while(<>){ if(m#^(.+) /// (.+)$#){ $flg = 1; $word = $1; $text = $2; $line = $_; if($word =~ / /){ #熟語なら if(length($word) > 15){ $flg = 0; } elsif($word =~ /([A-Za-z]+) ([A-Za-z]+)/){ if(length($1) > 5 && length($2) > 5){ $flg = 0; } } } if($text =~ m#/#){ $text =~ s#/ .+##g; } } if($flg){ print $word.' /// '.$text."\n"; } }

  • kkk311
  • お礼率61% (145/235)
  • Perl
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

あー、入力テキストがUTF-16なんですか。 だとすると、きちんとエンコーディングの設定をして読み込まないといけませんが、 スクリプトの、質問に貼られている以外の部分はどうなっていますか?

kkk311
質問者

お礼

スクリプトは質問内容ので全てです。 試しにSift-JSに変換してで試したところ、うまくいきました! でもなぜでしょうか…

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

UTF-16 では全ての文字が 16ビットで表されます. つまり「/」が例えば "\0/" のようになっているわけです. スクリプトの文字コードがどうなっているか知りませんが, そのために最初の if でマッチしていないんじゃないでしょうか. 今どきの perl では内部的に全て UTF-8 を使いますから, それ以外の文字コードのファイルを予定するときにはきちんとエンコーディングを指定しないとダメです. 「shift-jis にして動いた」というのは, たまたま英語なのでシフトJIS でも UTF-8 でも同じになっていたということだと思います.

kkk311
質問者

お礼

ありがとうございます! なぞが解けました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

私もそれを最初に思ったので #1 で「実際にはどのように入力して実行したのですか」と補足を求めたんですけどねぇ>#2. 「実際」の実行が #1 の補足にある通りなら (ほとんどの場合で) その線はないですし.... できればでいいのですが, 「与えた入力」と「期待する出力」を書いてもらえると助かるかもしれない.

kkk311
質問者

補足

実際の入力は以下です。 Perl\Bin\Perl eimin.pl c:\jiro.txt > c:\abc.txt 入力元のファイルは167MBの英語辞書テキストファイルです。(Unicode UTF-16) 期待する値は、長い熟語や名詞などを削除して小さくすることです。 ファイルが大きすぎるのでしょうか…

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ひょっとして、変換元のファイルと変換先のファイルで同じファイルを指定してたりしませんか?

kkk311
質問者

お礼

ありがとうございます。 入力元と、出力先は別名で設定していました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「0kB のテキストファイルができた」ときは, 実際にはどのように入力して実行したのですか?

kkk311
質問者

補足

こんにちは、実行したときには以下のように入力しました C:\Perl\Bin\Perl c:\プログラム.pl c:\変換元.txt > c:\変換先.txt

関連するQ&A

  • C言語でテキストファイルの内容を置換して保存したい

    C言語でテキストファイルを読み込んで、特定のキーワードを 見つけたら置換して、保存したいと考えています。 ネット上でテキストファイルの内容を置換して、保存するよう な情報を検索したのですが、見つからず質問することにしました。 例) hoge.txtを読みこんで、FLG=0となっている行を、FLG=1というように置換させたい。 FLG=0 ↓ FLG=1

  • Ruby1.9で文字列の置換がうまくいきません。

    Ruby1.9で文字列の置換がうまくいきません。 以下の処理を実行すると、gsubのところでEncooding::CommpatibillityError とエラーが発生してうまく置換が出来ません。 何が原因でしょうか。あるいはもっと簡単な方法で置換する方法がありましたら ご教示のほどお願いいたします。 <仕様> 半角、全角に関係なく指定文字で置換する。 ※大文字部分は実際は全角文字です。 moji1 = 1abc56abcABC" moji2 = "abc" moji3 = "CBA" ⇒正しい置換結果は、"1CBA56CBAABC" #半角→全角 空白含 moji2 = moji2.tr('a-zA-Z0-9 - ', 'a-zA-Z0-9 - ') moji2 = NKF::nkf( '-SsXm0', moji2 ) data = moji1.gsub(moji2,moji3)       ↑↑↑ここで上記のエラー発生する。 どうか宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 入力されたテキストからメールアドレス抽出するPHP

    入力されたテキストからメールアドレス抽出するPHPを作りたいのですが、下記の記述では抽出ができません。 どのように文を変えたら抽出できるでしょうか?よろしくお願い致します。 <form action="mail2.php" method="post"> <input type="text" name="text" size="100" value=""/><br /> <input type="submit" name="text" value="テキストからアドレスを抜き出す" /> </form> <?php if( preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",$text,$match)); echo "アドレス-> {$match[0]}\n"; print $arr_str[0];  ?>

    • ベストアンサー
    • PHP
  • WordVBA 置換処理での改行文字の可否

    (実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、) WordのVBAで、置換処理を作成しています。 keyword1 = "検索文字" keyword2 = "置換文字" With objSelection.Find .Text = keyword1 .Forward = True .MatchWholeWord = True .Replacement.Text = keyword2 .Execute Replace:=wdReplaceAll End With 置換処理自体は出来ています。上記処理は置換部分の抜粋です。 しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換処理です。 長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。 置換先でも改行された状態にしたいのですが、これは書き方に問題があるのでしょうか? もしくは置換処理ではなく、他の方法を取る必要があるのでしょうか? 教えてください。よろしくお願いいたします。

  • 行頭語による判別を含んだ、正規表現による置換

    条件つきの正規表現がうまく組めず困っております。 以下のような条件で、テキストファイルを置換しようとしております。 置換 (1) 全角英数字を半角化 (2) 半角カナを全角化 (3) & , " などの記号を文字参照(&amp;など)化   置換対象の種類は百程度あり、半角記号や全角機種依存文字など各種 警告 ・ 第三/四水準文字や、特定の文字コードの文字があれば警告 処理対象条件 A 置換対象のファイルは shift-jis B ファイル内には、機種依存文字、第三/四水準文字が含まれる C ファイル内の行が[en]から始まっていたら置換対象とする   ファイル内の行が[ja]から始まっていたら別の置換条件で置換する D ファイル内の行が[lang=en]だったら、次の行を置換対象とする   ファイル内の行が[lang=ja]だったら、次の行を別の置換条件で置換する 上記のような条件となっております。  当初、処理対象の条件がAとBだけだった時は、 ([0-9A-Za-z !”#$%&’()*+,-./:;<=>?@[¥]^_`{|} ̄]) → 半角化 (ガ|ギ|グ|ゲ|ゴ|ザ|ジ|ズ|ゼ|ゾ|ダ|ヂ|ヅ|デ|ド|バ|ビ|ブ|ベ|ボ|パ|ピ|プ|ペ|ポ|ヴ) → 全角化 などと一種類ずつ置換条件を書いて、置換と警告が出来ておりました。  しかしCとDの条件が追加されたため、うまくいかずに困っております。 ^(^ja-|^ja-)(.*?)([0-9A-Za-z !”#$%&’()*+,-./:;<=>?@[¥]^_`{|} ̄]+)  このような抽出条件を書いたりしましたが、置換対象と非対称が何度も交互に出る場合などに対応できておりません。  なお、CとDを含まない条件下では以下のフリーウェアを利用して置換処理をおこなっております。 http://www.sirmiles.com/repl_ace/  当初は Perl で開発しておりましたが、 ・ 第三水準文字などが入った時にファイル出力できなかったこと ・ 文字境界の問題か、全く同じ文字に対して置換できる場合とできない場合があったこと などにより上記フリーウェアの利用といたしました。  上記や処理対象条件のAが解決すれば、行頭語の判断は if 文のみでいけるのでPerlの芽もありだと思うのですが……  現在調査を進めている方策は、以下3点です。 1 正規表現のみで行頭条件分岐+全置換の仕方を見つけて、これまで使っていたフリーウェアで実施。 2 現在は全く知識がないのだが、秀丸マクロでプログラムを組む  (サブフォルダを含めファイルの一括処理、行単位での処理、行頭の判別、半角化や全角化などなど……) 3 第三水準文字などの扱いと、置換できる場合とできない場合の調査を行いPerlで開発 (優先順位としては 1>2>3 な感じですが、1は現在行き詰まり2で調査や試行錯誤中です)  どなたか詳しい方にご意見・可否などいただければ幸いです。  時間もなく、日中もネットにつながらないために返信も遅いかもしれませぬが、よろしければお知恵をお貸しください。

    • ベストアンサー
    • Perl
  • 文字の置換がうまくいかない

    ********** test.txt ************* $first = "abc"; $last = "xyz"; ********************************* ********** change.txt *********** $first $firstaaa $last ********************************* という2つのテキストファイルがあったとして、 open(IN,"test.txt"); @data = IN; close IN; open(A,"change.txt"); while(<A>){$a_data .= $_} close A; foreach (@data) { if(/(\$[a-zA-Z_]+)[\t\s]*=[\t\s]*"(.+)"[\t\s]*;/){ my $name = $1; my $value = $2; print "$name<br>"; #$nameに何が入っているか表示 $a_data =~ s/$name/$value/g; } } としても、change.txtの$firstや$lastがabcや、xyzに置換されないのですが、なにがいけないのでしょうか?print "$name<br>";のところではちゃんと$firstと$lastという風に出力されています。$a_data =~ s/$name/$value/g;を$a_data =~ s/\$first/$value/g; と変えると、ちゃんと$firstだけ置換されました。 なにか心当たりがある方、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 置換?について

    いつもお世話になっております。sako77です。 今回は置換?について質問させていただきます。 ファイルA(テキストファイル)に以下のような文章があります。 例) おはようございます。今日も●●●です。こんにちは。今日も◆◆◆◆です。おやすみ今日も■■です。・・・ 上記のようなテキスト文章から「今日も」から「です」の間の文字列を抽出し、別テキストファイルBに ●●●● ◆◆◆◆ ■■ のように出力したいのですが、こんなことはできるのでしょうか? エクセルかアクセス又はこんなことができるソフトがあれば教えてください。 よろしくお願い致します。

  • 全角英数字を半角英数字に置換する

    全角英数字を半角英数字に置換するJavaScriptを探していて、 見つけはしたのですが、HTML側の書き方が分かりません。 下記がそのソースになります。 onBlurで動くようにしたい場合、どのようにHTML側を記述してやったらよいでしょうか。 /* 全角英数字を半角英数字に置換する */ function z2h_word(src) { return src.replace(/([A-Za-z0-9_])/g, function ($0) { return String.fromCharCode($0.charCodeAt(0) - 65248); }); } 変な質問で申し訳ないですが、わかる方教えて下さい。

  • セルに入力した文字を別のシートで置換する方法

    複数置換を行いたいと思い、以下のマクロを作成しました。 If Range("B18") <> "" Then Cells.Replace what:=Range("B18"), replacement:=Range("D18") end if B18のセルが空欄ではない場合、 そのセルに入った文字を検索し、別の文字に変換するというものです。 1つや2つほどであれば、ショートカットキーを使って 置換をしていけば良いと思うのですが、 10項目以上、置換しなくてはならず同時処理を行いたいと思っています。 ただし、その10項目については対象ファイルごとにバラバラで、 統一性がないため、VBAの中に組み込むよりかは、 置換したい文字を各セルに入れていき、置換できればと思い、 マクロの作成を行いました。 ただ、上のマクロでは同じファイルではないと処理ができません。 ActiveSheetを使って処理を行うとは思うのですが、どのように記述してよいか分かりません。 お力添えを頂ければと思います。 上記内容で分かり辛いかもしれませんので、以下に箇条書きします。 1)複数置換を行いたい。 2)Aセルに置換対象の文字を入れ、Bセルに置換したい文字を入れる。 3)実行すると全シート上でA1セルに入力された文字を検索し、B1セルに入力してある文字に置き換わる。 4)これらの処理は同一ファイルで行うのではなく、それぞれ別ファイルで管理をする。 ※対象ファイルと実行データが別々のもの 以上です。 説明が分かりにくく、申し訳ありません。 もしVBAで以上のような処理が可能な場合、ご教授頂けますと幸いです。 (使用しているバージョンは、2003です。)

  • 多次元配列の処理について

    多次元配列を扱った処理を行ないたいのですが、一部でnullを受け取ってしまい、処理を行うことができません。 引数の配列には次のようなテキストが入っています。 --配列の内容-- 0,名詞-一般,1,5, 0,名詞-数,2,6, 0,名詞-接尾-助数詞,3,7, -------------- この配列をコマンドラインに書き出すと正確に表示されます。 しかし、配列の内容を参照して処理を行なうと2列目の処理のときにnullを参照してしまいます。 プログラムは以下のとおりです。 ---プログラム--- public class Dist {   public static int zairyo(String[][] date) {    int a = 0;    int b = 0;    int c = 0;    int d = 0;    int e = 0;    if(date != null) {     int f = 0;     System.out.println("//Dist//");     for(int m = 0; m < date.length; m++) {      for(int n = 0; n < date[0].length; n++) {       if(date[m][n] != null) {        System.out.print(date[m][n] + "\t");        f++;        if(f == date[0].length) {         System.out.println("");         f = 0;        }       }      }     }     for(int i = 0; i < date.length; i++) {      if(date[i][1] != null) {       if(date[i][1] == "名詞-一般")        a++;       if(date[i][1] == "名詞-数")        b++;       if(date[i][1] == "名詞-接尾-助数詞")        c++;      }else System.out.println("2列目null");     }     int j = date.length - 1;     d = Integer.parseInt(date[j][2]);     e = Integer.parseInt(date[j][3]);    }else System.out.println("Dist:null");    if(a > 0 && b > 0 && c > 0 && d <= 10 && e <= 15) {     return 1;    }else return 0;   } } ------------------------ 原因は何なのでしょうか? ご教授お願いします。