2016-08-22 20 views
2

私はEMR(Electronic Medical Records)システムに不満を持ち、切り替えたいクライアントを手助けしようとしていますが、患者の人口統計データデータベースから(名前、アドレス、dobを何らかの種類のcsvファイルに入れてもらえるかどうか、非常に基本的なものかどうかを尋ねました)。 (彼らはSQLデータベースを使用していると考えて狂っている)。 とにかく - 患者を引き渡す方法はxmlファイルにあり、そのうちの約40,000 +があります。しかし、彼らは人口統計よりもはるかに多くを含んでいます。 15年前に広範なPerlプログラミングを行った後(私はそれが長年にわたり錆びていると認めます)、Perlでこれを行うのは良い仕事だと思っていました。そのトリックをすることができるようだ。興味のある 残念ながらXMLコードは次のようになります。XML :: Twigは同じパスで同じ名前のタグを解析しています

< ==スニップ==> xmlファイルに以下のアドレスetc.areため

<patient extension="Patient ID Number"> // <--Patient ID is 5 digit number) 
    <name> 
    <family>Patient Family name</family> 
    <given>Patient First/Given name</given> 
    <given>Patient Middle Initial</given> 
    </name> 
    <birthTime value=YEARMMDD"/> 

複数のフィールド。

< ==スニップ==>ここで

は、私がコード化されたものです:

my $twig=XML::Twig->new(twig_handlers => { 
    'patient/name/family'  => \&get_family_name, 
    'patient/name/given'  => \&get_given_name 
}); 
$twig->parsefile('test.xml'); 

my @fields; 

sub get_family_name {my($twig,$data)[email protected]_;$fields[0]=$data->text;$twig->purge;} 
sub get_given_name {my($twig,$data)[email protected]_;$fields[1]=$data->text;$twig->purge;} 

私はユニークなタグ(家族、都市、郵便番号、などを持っている全ての情報を読み取る問題がありません。)しかしXML:Twigはタグの真ん中のイニシャルを返すだけです。 "given"の最初の出現にどのように対処し、$ fields [1]に、2番目の "given"を$ fields [2]に割り当てるか、または中間の頭文字をチャックします。

また、「患者ID」または「birthTime」の値をXML :: Twigで抽出するには、その参照を見つけることができませんでした。 私は$ data-> findvalue( 'birthTime')を使ってみましたが、それは空に戻りました。

私は見ました:Perl, XML::Twig, how to reading field with the same tagこれは非常に役に立ちましたが、重複したタグは同じパスにありますので、それは異なっており、私は答えを見つけることができません。 XML :: Twigは、ファイルの解析中に一致するものを見つけたときに最後に見つかった値だけを返しますか?値のすべての出現を抽出する方法はありますか?

ご協力いただきありがとうございます。

答えて

2

と書かれていることを仮定すると、はすべてのコールバックを使用することが非常に簡単です。しかし、文書全体を解析し、特にデータサイズが小さい場合は、特にそれを調べることは有効です。

あなたの質問から、各患者がそれぞれ別のXMLファイルを持っているかどうかは不明です。何patient要素を囲み、私は、私は、各patientから情報%patientのハッシュを構築するために選択したあなたは妥協のアプローチを使用することを示唆していると

を必要なすべての情報を抽出し、ちょうどpatient要素のハンドラを書きますファイル内のすべてのデータを含む配列@patientsにプッシュします。ファイルごとに1人の患者しかいない場合は、これを変更する必要があります。

私はname/given要素の問題を解決し、それらのすべてをフェッチして、それらを1つの文字列に挿入して結合します。私はそれが適切であることを望む

これは、私が現在手にするタブレットを持っているので、これは完全にテストされていないので、注意してください。コンパイルのチャンスはありますが、バグがなければ驚きます。

use strict; 
use warnings 'all'; 

use XML::Twig; 

my @patients; 

my $twig = XML::Twig->new(
    twig_handlers => { patient => \&get_patient } 
); 
$twig->parsefile('test.xml'); 

sub get_patient { 
    my ($twig, $pat) = @_; 

    my %patient; 

    $patient{id} = $pat>att('extension'); 

    my $name   = $pat->first_child('name');yy 
    $patient{family} = $name->first_child_trimmed_text('family'); 
    $patient{given} = join ' ', $name->children_trimmed_text('given'); 

    $patient{dob} = $pat->first_child('birthTime')->att('value'); 

    push @patients, \%patient; 
} 
+0

こんにちは、私は今夜それを試してみます。しかし、あなたの質問には、各患者には独自のxmlファイルがあります。私たちは解析する必要があるものが約40,000 +あります。そして、はい、私は最後の行で患者の閉鎖を忘れていました - 質問ボックスで書式を調べるのに少し問題がありました - そして、最後にそれを追加するのを忘れました(コピー&ペーストはコードのテキストボックスそうみたいです)。 – yoeddy

+0

こんにちはボロディン、ご協力いただきありがとうございます。投稿した内容は、Twigモジュールの理解を深めるのに役立ち、必要なデータを解析することができました。いいえ、データをクリーンアップして、これらのファイルで実行することはできません。ありがとうございました! – yoeddy

+0

最後にもう1つの質問 - ハッシュをグローバル配列にプッシュすることが大好き - きれいで清潔です。私の質問です - 私は40,000ファイルを解析する必要がある場合、これは問題になりますか?その配列に40,000 +ハッシュがありますか? perlはこのような大きな配列を扱うことができますか?あるいは、各ファイルの結果をcsvファイルに直接書き込むほうがよいでしょうか?私は、40,000ハッシュの配列を埋めて、最後にcsvファイルに書き込むよりも、小さなファイル操作でより多くのリソースを消費することを求めていると思いますか?ありがとうございました! :) – yoeddy

関連する問題