lax has asked for the wisdom of the Perl Monks concerning the following question:

hi monks

i want to count the no of characters in a text file and if the no of characters exceed say 160 ..then i should allow only 160 characters to be displayed and the remaining characters should be truncated and should not be displayed

thanks
lax

Replies are listed 'Best First'.
Re: text file validation
by marto (Cardinal) on Jul 21, 2006 at 13:06 UTC
    Hi lax,

    Take a look at substr:
    #!/usr/bin/perl use strict; use warnings; my $string="012345678901234567890" print substr($string,0,16);
    My test string is 20 characters long, so I have set the length of the substr function to 16. you can easily change that to 160 for your line.

    Update: Oops I forgot that you may not know how to open a file:
    #!/usr/bin/perl use strict; use warnings; open(FILE,"yourfilenamehere.txt") or die "Could not open file $!\n"; # + open yourfilenamehere.txt for reading while(<FILE>){ #read yourfilenamehere.txt a line at a time chomp; print "\n" . substr($_,0,160); #as described above, except prin +t first 160 characters only } close FILE #close filehandle
    You will need to change the filename, obviously. You may wish to check out the Tutorials section of this site.

    Update: Added comments to second code posting.

    Hope this helps.

    Martin
      hi monks
      thanks for your piece of code..

      $message = #22 2006-05-02 12:12:35 hjjjdddddd Advisory.No action required. event-101 severe is the name of the alarm but the way it is dispalyed cannot be digested at all 12121212121122
      substr( $message,0,160 );

      the above code truncates to 140 characters and display them instead of displaying 160 characters

      kindly help me out and also tell me a way to display only the first 160 characters

      thanks
      lax
        lax,

        Using the following code and your string I get 160 characters output:
        #!/usr/bin/perl use strict; use warnings; my $string="#22 2006-05-02 12:12:35 hjjjdddddd Advisory.No action requ +ired. event-101 severe is the name of the alarm but the way it is dis +palyed cannot be digested at all 12121212121122"; print substr($string,0,160); <code> Output: <code> #22 2006-05-02 12:12:35 hjjjdddddd Advisory.No action required. event- +101 severe is the name of the alarm but the way it is dispalyed canno +t be digested at all
        Can you please post the complete code you are using?

        Update: Fixed typo, print substr($string,0,16); changed to print substr($string,0,160);

        Martin
Re: text file validation
by davorg (Chancellor) on Jul 21, 2006 at 13:06 UTC

    Which part are you having trouble with?

    Some useful tips: open to open a file, <...> to read from a file, length to get the length of a string, substr to get a substring.

    And your question appears to have nothing at all to do with validation.

    --
    <http://dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

Re: text file validation
by Sidhekin (Priest) on Jul 21, 2006 at 13:57 UTC

    Well, you've been told how to print the first (up to) 160 characters of each line, and eventually how to print the first (up to) 160 characters of the entire file ... but I figured you might also want to know how to stop reading after having read the first (up to) 160 characters of the file, provided your "characters" are "bytes".

    my $read = do { local $/ = \160; # set record size open my $fh, '<', $filename or die "Could not open $filename: '$!'"; <$fh>; # scalar context, so the first record only }; # now print $read or whatever

    See $/.

    print "Just another Perl ${\(trickster and hacker)},"
    The Sidhekin proves Sidhe did it!

Re: text file validation
by jeanluca (Deacon) on Jul 21, 2006 at 13:15 UTC
    what about
    #! /usr/local/bin/perl -wl use strict; open IN,"<inpfile" ; local $/ ; my $r = substr(<IN>,0,160) ; print "$r" ;
    LuCa
Re: text file validation
by johngg (Canon) on Jul 21, 2006 at 21:23 UTC
    You can find the size of the file using the -s file test operator

    my $fileSize = -s $fileName;

    or by using the stat() built-in

    my $fileSize = (stat $fileName)[7];

    then you can decide how many bytes (always assuming characters are bytes) to read

    my $limit = 160; my $bytesToRead = $fileSize > $limit ? $limit : $fileSize;

    then use read() to read in what is appropriate (being sure to test for a successful read) and print it

    my $bytesRead = read($inpFH, my $inpBuffer, $bytesToRead); die qq{Bad read: read $bytesRead, expected $bytesToRead\n} unless $bytesRead == $bytesToRead; print $inpBuffer;

    I haven't shown getting and validating the file name or the opening and closing of filehandles here.

    I hope this is of use.

    Cheers,

    JohnGG

Re: text file validation
by jwkrahn (Abbot) on Jul 21, 2006 at 21:58 UTC
    One simple way is to set the Input Record Separator to 160 and just read one record:
    open my $fh, '<', $filename or die "Cannot open '$filename' $!"; $/ = \160; my $data = <$fh>; print $data;
Re: text file validation
by Moron (Curate) on Jul 21, 2006 at 13:09 UTC
    on *nix there is nothing extra needed (wc -c filename), whereas on Windows you could do something like:
    perl -e '$/=undef(); $_ = <>; print length($_)."\n";' < filename
    er, scratch that, you don't really want to count anything after all, but just find the substring as already suggested.

    -M

    Free your mind