perlで文字・数字の置換又は抽出に関する質問です。
print $line,"\n";
で文字を出力すると
29日(日)
30日(月)
1日(火)
2日(水)
・・・
のように出力できています。
これを以下のように出力したいと思っています。
1日目文字列:29日(日)
1日目日付:29
1日目曜日:日
2日目文字列:30日(月)
2日目日付:30
2日目曜日:月
3日目文字列:1日(火)
3日目日付:1
3日目曜日:火
・・・
日付のみの抽出、曜日のみの抽出はどのようにすればいいでしょうか。
教えてください。よろしくお願いします。
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
> Malformed utf-8 character (unexpected continuation byte…
上記のメッセージは、ソースファイルが cp932 (or Shift_JIS) で書かれていて、use utf8; 宣言されているときに出ます。ソースファイルを UTF-8 に変更する必要があります。
ありがとうございます。
今度はNo.5とNo.6のお礼に記載してあるプログラムの最下部に下のプログラムを実行したところ
--------------------------------
$line = ~ /(\d+)日\((.+)\)/;
print $1,"\n";
print $2,"\n";
--------------------------------
この追加したラインに
use of uninitialized value $_ in pattern match (m//) at …
use of uninitialized value $1 in print at …
use of uninitialized value $2 in print at …
のエラーが出ています。どうしたらいいのでしょうか。ご教示ください。
No.9
- 回答日時:
> while(my $line = decode('cp932', $fh->getline())){
$line =~ /正規表現/;
while の条件文から、$line は UTF-8 の内部文字列なので、正規表現も UTF-8 の内部文字列である必要があります。正規表現の文字コードは、No.5, 6 のお礼には書かれていない部分に依存します。文字コードがどうなっているのか、確認してみてください。
* ソースファイルの文字コードは UTF-8 になっているか?
* Encode, utf8 モジュールは指定されているか?
* open, binmode 等の関数の使用状況は?
ありがとうございます。
$line =~ /正規表現/; を足してやると
Malformed utf-8 character (unexpected continuation byte…
といったエラーが出ています。「rararaxx」さんの言うとおり、UTF-8としての文字解釈が出来ないようです。
最初に以下のようにモジュールを指定しているのですが、これだけでは不足でしょうか?すいませんが、お教えください。
use Encode;
use utf8;
binmode STDOUT => ":encoding(cp932)";
No.8
- 回答日時:
'29日(日)' というデータから '29' と '日' を取り出すというのであれば, 既に #2 や #3 で書かれている通りの方法を使うのが普通でしょう.
「エラーが出た」といっても
・どのようなデータに対して
・どのようなプログラムで
・どのようなエラーが出たのか
がまったくわからないままですが.
$line =~ /(\d+)日\((.+)\)/;
print $1,"\n";
print $2,"\n";
コードの末尾に「めぐみん_」さんからの頂いたコードを貼り付けて実行すると
この貼り付けたコードに対して以下のようなエラーコードが出ています。
Malformed utf-8 character (unexpected continuation byte…
UTF-8としての文字解釈が出来ないようですが、どうしたらいいでしょうか。
No.7
- 回答日時:
たぶん同案多数だと思うんだけど....
そのプログラムでなにをしたいんですか? 「プログラム全体としてなにをしたいのか」「その部分でなにをしている (つもりな) のか」がわからないです.
そしてもともとの質問文との関連もわからない.
すいません。
以下のようなtest.csvの記事から日付と曜日部分のみ取り出すプログラムを書きたいと思っています。
------------------------
戦績
29日(日)
勝ち
30日(月)
勝ち
1日(火)
負け
2日(水)
勝ち
・・・
------------------------
print $line, "\n";で「●日目文字列」の表示は出来るようになったので、この中から今度は日付と曜日を抜き出そうと思っています。本当の最終的な理想形は以下のように自在に出力したいと思っています。
print "1日目文字列:", $Game{syuukan}{'1日目文字列'}, "\n"; #29日(日)
print "1日目日付:", $Game{syuukan}{'1日目日付'}, "\n"; #29
print "1日目曜日:", $Game{syuukan}{'1日目曜日'}, "\n"; #日
自分の知識不足です。わかりにくい質問で申し訳ありませんが助けてください。お願いします。
No.6
- 回答日時:
あなたから出てきている情報が少なすぎるので「何が問題なのか」はわかりません. さしあたり
・Perl で書いたプログラム全体
・問題が発生するデータを数行
・perl が出しているエラーメッセージ全部
・プログラムとデータの文字コード
・perl のバージョン
を出してもらえますか?
my $Syu = File::Spec->catfile($basedir, 'DATA', 'test.csv');
our %Game;
our %Week = (
'2' => '1日目文字列',
'4' => '2日目文字列',
'6' => '3日目文字列',
'8' => '4日目文字列',
'10' => '5日目文字列',
);
my @in;
foreach my $key (keys %Week){
$in[$key] = $Week{$key};
}
my $fh = IO::File->new("<" . encode('cp932', $Syu)) or die "Can not open " . $Syu . ":" . $!;
while(my $line = decode('cp932', $fh->getline())){
my $line_no = $fh->input_line_number;
next unless $in[$line_no];
chomp($line);
unless(ref $Week{$line_no}){
$Game{syuukan}{$Week{$line_no}} = $line;
print $line, "\n";
}
}
これ以降どうやったらいいのでしょうか?お願いします。
ちなみにperlのverはv5.14.1です。
No.5
- 回答日時:
>print $line
この変数の中身が回答者にはまだ足りない情報が詰まっている?
これを実行する前にどのように取得しているのか?が気になってきますけど。
my $Syu = File::Spec->catfile($basedir, 'DATA', 'test.csv');
our %Game;
our %Week = (
'2' => '1日目文字列',
'4' => '2日目文字列',
'6' => '3日目文字列',
'8' => '4日目文字列',
'10' => '5日目文字列',
);
my @in;
foreach my $key (keys %Week){
$in[$key] = $Week{$key};
}
my $fh = IO::File->new("<" . encode('cp932', $Syu)) or die "Can not open " . $Syu . ":" . $!;
while(my $line = decode('cp932', $fh->getline())){
my $line_no = $fh->input_line_number;
next unless $in[$line_no];
chomp($line);
unless(ref $Week{$line_no}){
$Game{syuukan}{$Week{$line_no}} = $line;
print $line, "\n";
}
}
これ以降どうやったらいいのでしょうか?お願いします。
ちなみにperlのverはv5.14.1です。
No.4
- 回答日時:
#3 のところ, 「うまく処理されない」とはどういうことでしょうか? 具体的にはどのような入力に対してどのようになっていることを「うまく処理されない」といっているのでしょうか?
漢字とか英数字とかが混ざると文字コードの問題もあり得るのですが, そこは大丈夫でしょうか?
以下のようなエラーが出ています。何が問題なのでしょうか。わかりましたら教えてください。
Use of uninitialized value $1 in print at …test.pl …
Use of uninitialized value $2 in print at …test.pl …
No.3
- 回答日時:
どうも数字が全角半角混在の様なので、厳しくやるならば
my $c = 0;
foreach $line (<>) {
chomp $line;
if ($line =~ /^(.+?)日((.+?))/) {
$c++;
printf("%s日目文字列:%s\n", &h2z($c), $line);
printf("%s日目日付:%s\n", &h2z($c), &z2h($1));
printf("%s日目曜日:%s\n", &h2z($c), $2);
}
}
# 数字の全角半角変換、utf8 の tr が使えるなら不要です
sub h2z {
my $a = $_[0];
$a =~ s/0/0/g;
$a =~ s/1/1/g;
$a =~ s/2/2/g;
$a =~ s/3/3/g;
$a =~ s/4/4/g;
$a =~ s/5/5/g;
$a =~ s/6/6/g;
$a =~ s/7/7/g;
$a =~ s/8/8/g;
$a =~ s/9/9/g;
$a;
}
sub z2h {
my $a = $_[0];
$a =~ s/0/0/g;
$a =~ s/1/1/g;
$a =~ s/2/2/g;
$a =~ s/3/3/g;
$a =~ s/4/4/g;
$a =~ s/5/5/g;
$a =~ s/6/6/g;
$a =~ s/7/7/g;
$a =~ s/8/8/g;
$a =~ s/9/9/g;
$a;
}
一応数字は全て半角にするつもりでした。指摘ありがとうございます。
$line =~ /^(.+?)日((.+?))/
でうまく処理されないのはなんでなんでしょう。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Visual Basic(VBA) SQLで抽出 4 2022/12/04 13:55
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Excel 行の"〇" を検索して見出し(日付)を表示させたい 1 2022/04/04 18:35
- その他(買い物・ショッピング) 24時間コスメのファンデーションを購入を18時10分頃に購入しました。 ご注文後、通常2~3日以内に 1 2023/05/27 18:46
- Excel(エクセル) エクセル関数について 2 2022/04/13 18:25
- Excel(エクセル) 関数で複数ある→以降の文字の抽出したい 4 2022/08/07 09:47
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをバージョンアップしたら...
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
Cygwin64のtermio(s).hについて
-
Perlで、「が」を、「...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perlのエラーについてご教授く...
-
ラズベリーパイ初心者です。 ラ...
-
Perlで特定文字列から特定文字...
-
perl 初等プログラミングについて
-
bashスクリプト
-
perlプログラミング 空白行削除
-
Strawberry Perl for Windows ...
-
ファイルアイコンの左下に緑の□...
-
perlの構文でカンマの意味が分...
-
PerlでUTF-8のファイルの文字列...
-
Cygwin64のtermio(s).hについて
-
Perlで、「が」を、「...
-
Perlで時間の計算
-
TeraPadエディターの操作方法に...
-
perl LWPでURLにアクセスした時...
-
perl 正規表現でエラー
おすすめ情報
No.5とNo.6のお礼に記載してあるプログラムの最下部に下のプログラムを実行したところ
--------------------------------
$line = ~ /(\d+)日\((.+)\)/;
print $1,"\n";
print $2,"\n";
--------------------------------
この追加したラインに
use of uninitialized value $_ in pattern match (m//) at …
use of uninitialized value $1 in print at …
use of uninitialized value $2 in print at …
のエラーが出ています。どうしたらいいのでしょうか。ご教示ください。