今度はPerlに対する質問です。
ある業務において、複数のcsv、sql、テキストファイルからデータを抽出し、重複したデータを削除した上で、一つのテキストファイルに全データを集約しようとして、以下のプログラムを記述しました。
使用環境はWindows10上のコマンドプロンプトです。
Perl
1# 定義 2use warnings; #警告文を表示 3use strict; #型宣言など厳格なルールを警告する 4use utf8; #utf8を使用しますという宣言 5use Encode; 6binmode STDIN, ':encoding(utf8)'; 7binmode STDOUT, ':encoding(utf8)'; 8binmode STDERR, ':encoding(utf8)'; 9 10#ディレクトリを開く 11my @filepaths = glob("./all_issues/*"); 12 13#ディレクトリを横断して全ファイルの内容を取得 14my $stream = ""; 15foreach my $filename (@filepaths){ 16 open(IMP,$filename); 17 #ファイル内の全データ取得 18 while(my $content = <IMP>){ 19 getData($stream,$content); 20 } 21 close(IMP); #ファイルを閉じる 22} 23#print $stream; 24#重複データを削除する 25my @ar_content = split(/\r\n/, $stream); 26#ソート 27@ar_content = sort {$a cmp $b } @ar_content; 28#重複を削除 29my %hash = (); 30foreach (@ar_content){ 31 $hash{$_}++; 32} 33my @unique = keys %hash; 34#文字列に展開する 35foreach my $tmp(@unique){ 36 $stream = $tmp; 37} 38#エンコード 39$stream = Encode::encode('utf-8',$stream); 40#ファイルに書き込む 41 open(DATAFILE, ">> stream.txt") or die("Error"); 42 print DATAFILE $stream; 43 44#データを取得する########################################################## 45sub getData{ 46 my($stream,$filecontent) = @_; #複数の変数を受け取る 47 #chomp($filecontent); #Eof削除 48 $$stream .= $filecontent; 49}
ですが、元のファイルのエンコードが、UTF-8、Shift-JIS、euc-jpなど混在しているため、出力したデータの部分部分が文字化けしてしまい、困っています。
試してみたこと
エンコードの問題なのはわかっているので、
Encode::encode()のほかEncode::decode()、その他Encode::fromto()などもためしてみましたが、どれも決定的な解決とは至らず困っています。また、utf-8を指定した際に、Wide character in printというエラーも表示されることがあり、いろいろとページを巡回したのですが、文字化けの解消法が見つかりませんでした。
こちらも引き続き調査しているのですが、解決法をご教示いただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 12:19
2019/06/01 05:11
2019/06/24 02:28 編集