user2901835
user2901835

Reputation: 43

Split data separated by pipe from a file perl

I have a file which i have data pipe seprated having some values 0 ,1 , or some text. Now what i have to do is to read the file line by line and split data seprated by pipe and then if the values of any index is 1 then i have create increment it's value by 1 into a hash so at last i have a hash which will give details how many true values are there in the files.

Below is the example of data and the name of each value , if the value is 1 then in hash key value will get incremented by 1

A B C D E F G    H       I
===========================
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|0|0|0|ABC|15:44:07|0
0|1|0|0|0|1|ABC|15:44:07|0

So final out put will be like below :

$finalHash->{D} = 2;
$finalHash->{F} = 1;
$finalHash->{B} = 1;

I am able to read the file line by line :

 my $final_hash;
 for my $line ( <$ifh> ) {

    my @el = split( /\|/, $line );

    #Now here have to set the value in the hashkey where we will get the 1 value


  }

Upvotes: 1

Views: 169

Answers (1)

choroba
choroba

Reputation: 241828

Don't use for to iterate file lines, use while. The former might exhaust memory if the file was very large, as it needs to create a list of all the lines; the latter reads one line at a time.

#! /usr/bin/perl
use warnings;
use strict;

my @column_names = qw( A B C D E F );

my %counts;

while (<DATA>) {
    my @columns = split /\|/;
    for my $i (0 .. $#column_names) {
        ++$counts{ $column_names[$i] } if $columns[$i];
    }
}

use Data::Dumper; print Dumper \%counts;

__DATA__
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|1|0|0|ABC|15:44:07|0
0|0|0|0|0|0|ABC|15:44:07|0
0|1|0|0|0|1|ABC|15:44:07|0

Upvotes: 5

Related Questions