0

したがって、xmlを解析するこのコードがperlにあり、perlファイルをテキストファイルに出力して、すべてが次のような列になるようにします。

SpectrumIndex TotalIonCount Duration Spectrum 
Integer Float Float mass,abundance;mass1,abundance1;mass 2,abundance1

xml コードは次のとおりです。

<message>
       <cmd id="result_data">
          <result-file-header>
                 <path>String</path>
                 <duration>Float</duration>
                 <spectra-count>Integer</spectra-count>
          </result-file-header>
          <scan-results count="Integer">
                 <scan-result>
                 <spectrum-index>Integer</spectrum-index>
                 <time-stamp>Integer</time-stamp>
                 <tic>Float</tic>
                 <start-mass>Float</start-mass>
                 <stop-mass>Float</stop-mass>
                 <spectrum count="Integer">mass,abundance;mass1,abundance1;
                 mass2,abundance2;mass6,abundance6</spectrum>
                 </scan-result>
                 <scan-result>
                 <spectrum-index>Integer</spectrum-index>
                 <time-stamp>Integer</time-stamp>
                 <tic>Float</tic>
                 <start-mass>Float</start-mass>
                 <stop-mass>Float</stop-mass>
                 <spectrum count="Integer">mass3,abundance3;mass4,abundance4;
                 mass5,abundance5</spectrum>
                 </scan-result>
            </scan-results>
    </cmd>
</message>

ただし、次の perl コードを使用します。

#!/usr/bin/perl-w
#example to write to text
my $file = "gapiformat.txt";
unless(open FILE, '>'.$file) {
    die "\nUnable to create $file\n";
}
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;


 my $values= XMLin('samplegapi.xml',ForceArray => ['scan-result','result-file-header']);


my $results = $values->{'cmd'}->{'scan-results'}->{'scan-result'};
my $results1= $values->{'cmd'}->{'result-file-header'};

printf FILE ("%-s %-s %-s %s\n","SpectrumIndex","TotalIonCount","Spectrum","Duration");
for my $data (@$results) {
    my $spectrum=$data->{spectrum};
    for my $data1 (@$results1){    
    printf FILE ("%-s %-s %-s %-s\n",$data->{"spectrum-index"}, $data->{tic}, $spectrum          
->{'content'},$data1->{duration});
    }   
  }

次の出力がテキスト ファイルに出力されます。

 SpectrumIndex TotalIonCount Spectrum Duration
 Integer Float mass,abundance;mass1,abundance1;
                 mass2,abundance2;mass6,abundance6 Float
 Integer Float mass3,abundance3;mass4,abundance4;
                 mass5,abundance5 Float

どんな助けでも大歓迎です!

4

3 に答える 3

0
  1. 現代のperlでは:

    • の 3 つの引数形式を使用します。open()
    • my裸のファイルハンドルの代わりに変数を使用します
    • 問題が発生すると、システム エラー メッセージ ( $!)が出力されます。

    open my $INFILE, '<', $fname
        or die "Couldn't open $fname: $!";
    
  2. 行ごとに印刷する必要があります。1 つの列を印刷してから別の列を印刷することはできません。
    したがって、これを行うと:

    printf FILE (
        "%-s %-s %-s %-s\n",
        $data->{"spectrum-index"},
        $data->{tic},
        $spectrum->{'content'},
        $data1->{duration}
    );
    

    ...もちろん、そのすべてのデータは1行になります。

于 2013-06-07T00:24:30.613 に答える
0

私はそれを理解しました...私はちょうど使用しました:

my $content=$spectrum->{'content'};
$content=~s/\s+$//g

そしてそれはトリックをしました

于 2013-06-19T21:26:54.443 に答える