- 締切済み
テキストファイルから日本語部分を削除
英語と日本語が交ざっているテキストから日本語部分を削除するプログラムをPerlで書きたいと思って以下のようなプログラムを組みましたが、うまくいきません。 while ( <IN> ) { chomp; tr/^[\x00-\x7f]//d; print OUT "$_\n"; } Perl初心者です。助けてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- z_liang_00
- ベストアンサー率42% (45/107)
「欲しい文字以外を削除する」という 考え方は如何でしょうか。 tr/^[\x00-\x7f]//d; ↓ s/[\x80-\xFF]//g; ただし、文字コードによっては、やはりうまく行かないと思います。 文字コードによって、「日本語部分」の表し方が違っており、 日本語部分の中にASCII文字と同じコードが含まれる場合があります。 UTF-8 や euc-jp、SJIS でしたらこの方法で大丈夫だと思いますが、 JIS はダメです。 どんな文字コードも入力可能にするのでしたら、 Tacosan さんの仰言るように 最初に nkf -g あたりでコード判定をして UTF-8 に文字コード変換してから入力するのが良いかと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
テキストの文字コードがわからないと, なかなかうまくいかないと思う. 確か自動的に「推定」して変換するモジュールはあったような気がするから, そいつで EUC か Unicode にでも変換して「日本語部分」を削除するんだろうけど.... どんなモジュールがあったかは覚えてないから, 適当に検索してください. ああ, 「日本語部分」を削除するんだから, フランス語とか中国語は削除しなくていいんでしょうか?
お礼
ありがとうございます。 やはり簡単にアASCIIコードを抽出というのがないでしょうか。 入力ファイルは英語教科書であり、英語と日本語以外他の言語はありません。 目的は英語部分を抽出し、英語コーパスを試作してみたいです。
- Tacosan
- ベストアンサー率23% (3656/15482)
tr の使い方が間違っています. 日本語部分をどのように削除するかは文字コードによります.
補足
Tacosan,さっそくの返信ありがとうございます。 文字コードというのは、Shift-JIS,UTF8等のことでしょうか? 実は入力テキストファイルは多数あり、 Shift-JISもあれば、UTFもありさまざまです。 日本語を削除=ASCIIコード部分のみを抽出 と思いますが、こんなスクリプトはどう書けばいいでしょうか?
お礼
ありがとうございます。 上記だと、漢字の2バイト目が残ってしまう可能性がありますよね。 16進表記では、なかなかうまくいきませんので、 とりあえず16進をやめて、必要なもの以外を削除というスクリプトを組んでます。 tr/a-zA-Z0-9その他必要の符号//cd; これでもたまに変なものが残りますが(やはり文字コード問題でしょう)、 99%うまく稼働します。