旅行好きのおしりトラブル対策グッズ3選

以下のような病院一覧のデータを、1レコード1病院に整理したいと考えています。
-----------
1 01-1017-7 斉藤医院〒038-0056 斉藤 誠一斉藤 誠一医
青医17 青森市大字飛鳥字岸田2 から
2 01-1024-3 医療法人同仁会 浪打〒030-0902 医療法人 同仁会 理菊田 一貫医
青医24 病院青森市合浦二丁目11-24 事長 菊田 一貫 から
3 01-1064-9 渡辺病院〒030-0823 医療法人 厚生会 理福島 彬裕医
青医64 青森市橋本一丁目7-4 事長 福島 彬裕 から
-----------
数字で始まる行が「1,2,3」が各病院を表しているようですが、
1病院が3レコードだったり、4レコードだったりとばらばらです。

思いついたのは、数字で始まる行の先頭に記号(例:★)をつけ、
一旦、改行を全部外し、記号(例:★)のついた行で改行をする…

どんな方法でも良いので処理できないものか、悩んでいます。
お力を貸していただけないでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

ANo. 3です。


ひどく寝呆けていたようで、大変失礼しました。
下記のコードにて動作確認済みです。
よろしくお願いします。


#!/usr/bin/perl
use strict;

open(IN, "data.txt") or die "ファイルが開けない";
open(OUT, "> data2.txt") or die "ファイルが開けない";

my @buff;
while(<IN>){
chomp;

if(/^\d+ [\d-]+/ && @buff){
printf(OUT "%s\n", join(" ", @buff));
undef @buff;
}

push @buff, $_;
}

printf(OUT "%s\n", join(" ", @buff));
    • good
    • 0
この回答へのお礼

ほんとうに有難うございました

お礼日時:2010/12/28 08:57

1 01-1017-7 斉○医院〒03x-00x6・・・・・・・・・


2 01-1024-3 医療法人同○会 浪打〒03x-09x2・・・
3 01-1064-9 ○辺病院〒03x-08x3・・・・・・・・・

先頭に連番らしき数字、次にxxx-xxxx-xの形式番号、次に名称、次に「〒」と郵便番号。
以降は何文字、何行あるかわからない情報。

整形するには、何か一定になるルールを見つけることです。
ルールが一定になればなるほど整形しやすいです。
先頭の連番の数字が1ケタと2ケタとあるようなら、
2ケタにしてやるとか、2段階になってても整形してやればなお処理を考えやすい。
01 01-1017-7 斉○医院      〒03x-00x6・・・・・・・・・
02 01-1024-3 医療法人同○会 浪打〒03x-09x2・・・・・・・・・
03 01-1064-9 ○辺病院      〒03x-08x3・・・・・・・・・


それと、
住所氏名など個人情報につながるものは
投稿するときには、特定できないように伏せた方がいいです。
だれがどう悪用するかわかりません。
    • good
    • 0
この回答へのお礼

ご指導有難うございます。
「ルールを見出す」とても大切な事ですよね。
頑張って整形していきたいと思います!
※記載データはWebで公開されているものですから、個人情報とは捉えておりません。

お礼日時:2010/12/28 08:55

とりあえず Perl で書いてみる:



@hospitals = ();
while (<>) {
chomp;
if (/^\d/) {
push @hospitals, $_;
} else {
$hospitals[-1] .= $_;
}
}

$" = "\n";
print "@hospitals\n";

ちなみに最初の行が数字ではじまらないといきなりエラーになるというオチもあり.

むぅ, ワンライナーにしようと思えばできるなぁ....
    • good
    • 0
この回答へのお礼

有難うございます。
エラーを回避できる知識が自分にあれば…と悔しいです(ーー;)

お礼日時:2010/12/22 15:22

これでどうでしょうか。




#!/usr/bin/perl
use strict;

open(IN, "data.txt") or die "ファイルが開けない";
open(OUT, "> data2.txt") or die "ファイルが開けない";

my $str = join("", <IN>);

my @record = ($str =~ /(\d+ [\d_+].+)+/g);
for(@record){
s/[\r\n]//g;
printf(OUT "%s\n", $_);
}

この回答への補足

ご指導有難うございます。1行1病院、ますます近づいてきました。
先頭が数字で始まるようになりましたが、数字で始まる行しか出力されて来ませんでした(ーー;)
数字で始まらない行が消えてしまっているみたいです。
もう少しお力添えいただけると助かります。

補足日時:2010/12/22 15:09
    • good
    • 0
この回答へのお礼

ご指導有難うございます。

お礼日時:2010/12/28 08:58

さしあたり次の 2点を明確にしてほしい.


1. 「レコード」って何? 「行 = レコード」と思っていい?
2. どんな形式に「整理」したいの? たとえば最初の 2行を単純に 1行にすると

1 01-1017-7 斉藤医院〒038-0056 斉藤 誠一斉藤 誠一医青医17 青森市大字飛鳥字岸田2 から

になるんだけど, それでいいの?

この回答への補足

>1.「レコード」って何? 「行 = レコード」と思っていい?

 はい

>2.どんな形式に「整理」したいの? たとえば最初の 2行を単純に 1行にすると
>1 01-1017-7 斉藤医院〒038-0056 斉藤 誠一斉藤 誠一医青医 17 青森市大字飛鳥字岸田2 から
 
 単純に1行になれば良いです。

補足日時:2010/12/21 11:24
    • good
    • 0
この回答へのお礼

有難うございます

お礼日時:2010/12/22 15:10

仰っている内容を理解出来ているかわかりませんが、こういうことでしょうか。




#!/usr/bin/perl
use strict;

open(IN, "data.txt") or die "ファイルが開けない";
open(OUT, "> data2.txt") or die "ファイルが開けない";
my $str = join("", <IN>);

my @record = ($str =~ /(.+?から)/sg);
for(@record){
s/[\r\n]//g;
printf(OUT "%s\n", $_);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。かなり欲しいものに近づきました。
1点質問内容に補足しても良いでしょうか。
-------------
6 01-1216-5 青森市民病院〒030-0821 017-734-2171 青森市棟方 博文医 538平成17年12月16日
(01-3216-9) 青森市勝田一丁目14-20 から
青医216 平成23年12月15日
7 01-1222-3 医療法人 近藤病院〒030-0813 017-734-3541 医療法人 回生会 理近藤 利満医 107平成18年 3月25日
青医222 青森市松原三丁目13-21 事長 近藤 利満 から
-------------
6(青森市民病院)のように、「*から」で終わらず、「*青医216 平成23年12月15日」で終わる行もあるのです。
処理は何段階に分かれても構わないので、もう少しお知恵を拝借できないでしょうか。

お礼日時:2010/12/21 11:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング