以前解決済みとしたのですが、解決していないので
もう一度よろしくお願いします。
以下のプログラムは、xxx.txtの内容を例えば、
(1)ぁ→ァ
(2)シイ→シー
(3)オウ→オー
に変化させようというものです。
現在のところ、出力ファイルには何も変化していない
ファイルが出力されるだけです。
use encoding 'euc-jp';は5.8.4では通りますが、
5.8.7ではエラーとなってしまいます。
入力ファイルの文字コードはEUC、改行コードはLF。
このperlファイルも同じ文字、改行コードを用いて
います。
どのように書けばよいのか、よろしくお願いいたします。
open(IN, "xxx.txt");
open(OUT, "> ***.txt");
while($b=<IN>){
for($i=0; $i<=258; $i++){
if($b[$i] =~ /[ぁぃぅぇぉ]/){
$b[$i] =~ s/[ぁぃぅぇぉ]/[ァィゥェォ]/;
}
if($b[$i] =~ /[イシチニ]イ/){
$b[$i] =~ s/イ/ー/;
}
if($b[$i] =~ /[オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ]ウ/){
$b[$i] =~ s/ウ/ー/;
}
}
}
close(IN);
close(OUT);
No.1ベストアンサー
- 回答日時:
>use encoding 'euc-jp';は5.8.4では通りますが、
>5.8.7ではエラーとなってしまいます。
私の環境は5.8.4なので、確認できないですが、
5.8.7でも使えると思いますが・・
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)", "in.txt");
open(OUT, ">:encoding(euc-jp)", "out.txt");
while($b=<IN>){
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
print OUT $b;
}
close(IN);
close(OUT);
この回答への補足
私の環境だとuse encoding "euc-jp";の行で
エラーとなってしまいます。
エディタとして「Perlを始めよう」というもの、
パスはperl.exeのある、binファイルに通してあるのですが…。
名前を見てびっくりしました。
以前回答を頂いたBLUEPIXYさんですね。
本当にありがとうございます。
現状は補足のとおりです…。
No.5
- 回答日時:
>化ける行の断片は、
>番+バン+2/0/0
>で+デ+61/0/0
>お待ち+オマチ+17/0/0
>の+ノ+71/0/0
を
use encoding 'euc-jp';
open(IN, "<:encoding(euc-jp)", "EUC.txt");
で読み込んでもエラーにはなりませんでした。
出来ました!! ありがとうございました.
元のファイルから違うファイルに移し変えたら出来ました.
そんなものですね….大変お世話になりました.
私としては20ポイント以上差し上げたい気持ちです.
>BLUEPIXY さんが間違うわけなし
結構有名な方なのですね.
私は質問の数が上回っていますが,BLUEPIXYさんを目指して頑張っていきます.
No.4
- 回答日時:
>すぐの返答は大変うれしいです.
結局なんの解決にもなってないので申し訳ないです・・
>euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39.
は、入力ファイルを読み込んで、EUC-JPとして読み込み内部表現であるUnicodeに変換するルールが見つからなかったというようなメッセージです。
通常だったらEUCとして変であるとか
文字コードの領域が全て対応しているとは限らないので、
変換できない文字があるということです。
そういう場合には、入力やコードなどを全てUTF-8で処理するのが常道かと思いますが、
よろしければ試してみたいので、
化ける行の断片を補足していただけませんか?
あと、関係ないですが
>open(OUT, ">:encoding(euc-jp)","> kekka.txt");
の時には、
>open(OUT, ">:encoding(euc-jp)","kekka.txt");
でいいです。
この回答への補足
化ける行の断片は、
(jisyo01.txtの内容)
番+バン+2/0/0
で+デ+61/0/0
お待ち+オマチ+17/0/0
の+ノ+71/0/0
などです。
最終結果は
で+デ+61/0/0 [で] D e
のようになります。
#スクリプト
open(IN,"phone.txt");
$j = 0;
while($a=<IN>){
chomp $a;
@list = split(/\+/, "$a");
$kana[$j] = "$list[0]";$yomi[$j] = "$list[1]";
$j++;
}
close(IN);
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","jisyo01.txt");
open(OUT, ">:encoding(euc-jp)","> kekka.txt");
while($b=<IN>){
chomp $b;
@list2 = split(/\+/, "$b");
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
for($i=0; $i<=258; $i++){
$list2[1] =~ s/$kana[$i]/$yomi[$i]/g;
}
print OUT "$b [$list2[0]]$list2[1]\n";
}
close(IN);
close(OUT);
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","kekka.txt");
open(OUT, ">:encoding(euc-jp)","> kekka2.txt");
@lines = <IN>;
@sortedlines = sort @lines;
print "@sortedlines\n";
#print $sortedlines[0];
for($i=1; $i<=@sortedlines; $i++){
if($sortedlines[$i] =~ /\s:\s/){
$sortedlines[$i] =~ s/\s:\s/:/;
}
if($sortedlines[$i] ne $sortedlines[$i-1]){
print OUT $sortedlines[$i];
}
}
close(IN);
close(OUT);
use encoding "euc-jp";
require "jcode.pl";
open(IN, "<:encoding(euc-jp)","kekka2.txt");
open(OUT, ">:encoding(euc-jp)",">> 20k.htkdic");
@str = <IN>;
foreach $str(@str){
&jcode::convert(\$str, "euc");
}
close(IN);
print OUT @str;
close(OUT);
phone.txtの内容(50音の音が入っている)
ナ+n a
ニ+n i
ヌ+n u
ネ+n e
ノ+n o
ハ+h a
ヒ+h i
フ+f u
ヘ+h e
ホ+h o
など。
>結局なんの解決にもなってないので申し訳ないです・・。
なんて優しい方なのでしょう。本当にありがとうございます。(涙)
最後のリダイレクトのアドバイスもありがとうございます。
まだ質問ですが…。よろしくお願いいたします。
No.3
- 回答日時:
>Can't locate encoding.pm in @INC
>(@INC contains: C:/Perl/lib C:/Perl/site/lib .)
は、encoding.pmが無いってことです。
5.8以降のマニュアルには、encodingの記載があるので、
削除されたかインストールがうまくいっていないのでは?
もしくは、そもそもバージョンが5.8未満であるとか
この回答への補足
その可能性が高いかもしれません.
インストールをやり直してみます.
ところで違う問題が出てきてしまいました.
もう一度お願いできますか….
スクリプトを走らせると,エラーメッセージが
出た後,出力ファイルにはかなや漢字が文字化け
した結果が出力されています.
もちろんuse encoding "euc-jp"はopenする前に
に必要なのでしょうが….
よろしくお願いいたします.
#変換処理
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","jisyo01.txt.cha");
open(OUT, ">:encoding(euc-jp)","> kekka.txt");
while($b=<IN>){
chomp $b;
@list2 = split(/\+/, "$b");
$b =~ tr/ぁぃぅぇぉ/ァィゥェォ/;
$b =~ s/([イシチニ])イ/$1ー/g;
$b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g;
for($i=0; $i<=258; $i++){
$list2[1] =~ s/$kana[$i]/$yomi[$i]/g;#r駻 囁圦q繒灑*r r゜r r r qハzfqロqヌysuオ
}
print OUT "$b [$list2[0]]$list2[1]\n";
}
close(IN);
close(OUT);
#ソートと重複要素取り除く
use encoding "euc-jp";
open(IN, "<:encoding(euc-jp)","kekka.txt");
open(OUT, ">:encoding(euc-jp)","> kekka2.txt");
@lines = <IN>;
@sortedlines = sort @lines;
print "@sortedlines\n";
#print $sortedlines[0];
for($i=1; $i<=@sortedlines; $i++){
if($sortedlines[$i] =~ /\s:\s/){
$sortedlines[$i] =~ s/\s:\s/:/;
}
if($sortedlines[$i] ne $sortedlines[$i-1]){
print OUT $sortedlines[$i];
}
}
close(IN);
close(OUT);
#ファイルに出力
require "jcode.pl";
open(IN, "kekka2.txt");
open(OUT, "> 20k.htkdic");
@str = <IN>;
foreach $str(@str){
&jcode::convert(\$str, "euc");
}
close(IN);
print OUT @str;
close(OUT);
エラーメッセージ
euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39.
euc-jp "\xA1" does not map to Unicode at jisyo01_1.pl line 35, <IN> line 94.
このようなものが何行も続く.
BLUEPIXYさん.すぐの返答ありがとうございます.
質問をしても返答が帰ってこない場合を経験しているので,
すぐの返答は大変うれしいです.
補足が長くなってしまいましたが,文字が正常に出力されません….
どのようにしたらよいのかわかりましたらよろしくお願いいたします.
No.2
- 回答日時:
>私の環境だとuse encoding "euc-jp";の行で
5.8.7にアップデートしてみましたが、
#1のスクリプトで問題有りませんでした。
INのファイル及びスクリプトが本当にEUCになってますか?
エラーメッセージはどのようにでていますか
この回答への補足
INファイル及びスクリプトはEUCになっています。
エラーメッセージは、
Can't locate encoding.pm in @INC
(@INC contains: C:/Perl/lib C:/Perl/site/lib .)
at jisyo01_1.pl line 14.
となっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル中の記述文字の一括置...
-
ドットを含まないファイルの表示
-
ファイル操作
-
VBAでCSVファイルの特定行を書...
-
csvファイルの横方向への改行に...
-
fgets で値が取得できない
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
python renameについて
-
sprintfで10進数を桁数指定で16...
-
perlで、後ろの行を読んで、前...
-
コマンドライン引数で正規表現...
-
DOSコマンドで、標準出力を出力...
-
巨大ファイルの行をを逆順に並...
-
ハッシュにファイルハンドル
-
log2の「正確な」計算方法
-
awkスクリプトでダブルクォーテ...
-
【Access2003】VBAでタブ区切り...
-
データファイルをプロットする(...
-
unixでのファイルロックの方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
テキストファイルの各行を配列...
-
「パスが見つかりません」とい...
-
ifstream/ofstream について
-
ファイルの内容をスカラー変数...
-
Fortranで1行飛ばして読み込む方法
-
perlで先頭の数値をみて昇順に...
-
特定のデータを更新する
-
Visual Basicを使って三平方の...
-
system関数と引数について
-
タイピング文字の一番後ろがお...
-
[perl] もっとシンプルに改良、...
-
VC++でperlプログラムを動かすには
-
shellのコマンド deffの差分の...
-
資格試験に向け、ipodで見れる...
-
ファイルから検索条件を読み込...
-
Pythonでegrep機能をつかいたい
-
バッチファイルでテキストファ...
-
FORTRANのプログラミング
-
perlでIEのクッキーを削除したい
おすすめ情報