質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

636閲覧

perl 日本語パターンマッチ

bluebird

総合スコア1

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2022/12/02 06:34

前提

日本語ファイルをデータベースに格納する為
strawberry perl でコンバーターを作成しています。

実現したいこと

都道府県ごとにファイルを分割するのが目的です。
読み込んだファイルの住所のフィールドが●●で始まっていたら、出力ファイルへ、が希望する動作です。

発生している問題・エラーメッセージ

マッチするはずの東京都のレコードはスルーされ
出力されないまま終了します。
elseでprintすると全読み込み行が出力されます。

該当のソースコード

#!/usr/bin/perl

use utf8;
#binmode STDIN, ':encoding(cp932)';
#binmode STDOUT, ':encoding(cp932)';
#binmode STDERR, ':encoding(cp932)';
#binmode STDIN, ':utf-8';
#binmode STDOUT, ':utf-8';
#binmode STDERR, ':utf-8';
use Encode qw/encode/;

our $file = 'data.csv';
#our $rslt = 'c:\Strawberry\data_tokyo.csv';

読み込みファイル

open(our $in, "<", $file) or die "Cannot open input: $file: $!";

書き出しファイル

#open(our $out, ">", $rslt) or die "Cannot open output: $rslt: $!";
while(our $str = readline $in){
chomp $str;
$str = encode('utf8', $str);
#$str = decode('utf-8', $str);
our ($pref) = (split(/,/, $str))[8];
if($pref =~ /^東京/){
# Encode::from_to( $str, 'utf-8', 'sjis' );
print "$str\n";
}
}

close $in or die qw/Can't close file "$in": $!/;
#close $out or die qw/Can't close file "$out": $!/;

exit;

試したこと

perlスクリプトはutf8 読み込みファイルはshift-jisです
日本語の判定に失敗しているので苦手な文字コード云々か、とネット上の
サンプルを色々試した残骸がコメントアウト部分です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2022/12/02 09:52

コード部分はコードブロックで囲うと読みやすくなりますよ
guest

回答2

0

自己解決

解答いただいた皆様、ありがとうございます。長い間返答もつけず大変失礼いたしました。質問当時の不慣れな開発環境(Windows)から間もなくLinux環境に代わり自己解決しております。

投稿2023/08/07 03:26

bluebird

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

関連性の高い質問について過去に回答しています。
perl jsonで日本語文字化け
ここをみて原則通りにやってみてください。
現状では、入力データのデコード、出力データのエンコード、ともにできていないでしょう。あらゆる処理はデコードされたデータに対してしか試みてはいけません。

最低限のコードを書いておきます。

  • データは読み込むと同時にデコードする。
  • データは書き込む寸前にエンコードする。
  • いま扱おうとしているデータがデコードされているのか居ないのか常に意識する。
  • あらゆる処理はデコードされたデータについてのみ行う。
  • あやふやな認識のまま試行錯誤をしない。
  • 巷にあふれるいい加減な解説は信用しない
use strict; use warnings; use utf8; open(my $fhi, '<encoding(cp932)', "input.sjis.txt") or die; # 読み込みながらdecode open(my $fho, '>:utf8', "output.utf8.out"); # 書き出す時にencode while(<$fhi>){ /東京/ and print {$fho} $_; }

投稿2022/12/02 18:58

編集2022/12/05 08:05
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問