2013-06-07 1 views
0

Так у меня есть этот код в Perl, который анализирует 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 

Любая помощь приветствуется!

ответ

0
  1. В современном Perl:

    • вы используете три аргумента форму open()
    • использовать my переменные вместо bareword дескрипторов
    • и Выводится сообщение об ошибке системы ($!), когда все идет не так:

    open my $INFILE, '<', $fname 
        or die "Couldn't open $fname: $!"; 
    
  2. Вы должны печатать по строкам. Вы не можете напечатать один столбец, а затем другой столбец.
    Так что, когда вы это делаете:

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

    ... тогда, конечно, все, что данные собираются находиться на одной линии.

+0

Я на самом деле просто пытается выяснить, как получить данные спектра быть по отдельным линиям –

+0

"\ n". Например, «% -s \ n% -s \ n% -s \ n». Строка формата для printf() является обычной строкой, за исключением замены специальных кодов%. – 7stud

+1

Почему бы вам не опубликовать образец вашего XML-файла и нужный результат с некоторыми фактическими числами? Кстати, желаемый вывод, который вы опубликовали, не имеет никакого смысла. Я не знаю, будет ли это неправильно отображаться программным обеспечением форума или что. Вы исправили свой пост? – 7stud

1

Просто положи сколько символов вы хотите в Printf: например,

printf FILE ("%20s %20s %40s %10s\n",...) 
0

я понял это ... я просто использовал:

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

и что сделал трюк