YoDar
YoDar

Reputation: 387

How can I convert floating point values in text to binary using Perl?

I have text file looks like that:

float a[10] = {
    7.100000e+000 ,
    9.100000e+000 ,
    2.100000e+000 ,
    1.100000e+000 ,
    8.200000e+000 ,
    7.220000e+000 ,
    7.220000e+000 ,
    7.222000e+000 ,
    1.120000e+000 ,
    1.987600e+000
};

unsigned int col_ind[10] = {
    1 ,
    4 ,
    3 ,
    4 ,
    5 ,
    2 ,
    3 ,
    4 ,
    1 ,
    5
};

Now, I want to convert each array (float / unsigned int) to different binary files - big endian type, a binary file for all float values and a binary file for all integer values.

What is the simple way to do it in Perl, consider I have over two millon elements in each array?

Upvotes: 3

Views: 786

Answers (1)

FMc
FMc

Reputation: 42411

You'll want to look into binmode and pack. Here's an example that might get you started. I'm not sure I've chosen the pack templates that you need, but see the pack documentation for all of the choices.

use strict;
use warnings;

my ($fh, $pack_template);

while (my $line = <>){
    if ( $line =~ /(float|int)/ ){
        $pack_template = $1 eq 'int' ? 'i' : 'f';

        undef $fh;
        open $fh, '>', "$1.dat" or die $!;
        binmode $fh;

        next;
    }

    next unless $line =~ /\d/;
    $line =~ s/[,\s]+$//;

    print $fh pack($pack_template, $line);
}

Upvotes: 3

Related Questions