homepage Welcome to WebmasterWorld Guest from 54.211.157.103
register, free tools, login, search, pro membership, help, library, announcements, recent posts, open posts,
Pubcon Platinum Sponsor 2014
Home / Forums Index / Code, Content, and Presentation / Perl Server Side CGI Scripting
Forum Library, Charter, Moderators: coopster & jatar k & phranque

Perl Server Side CGI Scripting Forum

    
Help needed with CSV file, how to print 2nd word from 2nd line
I need to print/extract the 2nd entry from the 2nd line in a CSV file
fredfletcher




msg:4249065
 7:44 pm on Jan 4, 2011 (gmt 0)

Hello, I was wondering if anyone could help me with something.

I am not a programmer yet I am able to modify scripts to a certain extent. I have a script to read an existing CSV file and output via an SSI call. What I would like to do is to be able to read the third entry from the 3rd column/2nd row, for example:

Bob;565 Apple Tree Lane;Vancouver;Canada
Fred;1234 Maple Road;Montreal;Canada

I would need to get/print the word "Montreal" (third entry from the second line, or any of my choice) from an existing CSV file and output using SSI, but not in a table, just as plain text with no carriage return, can you help?

Here is the CGI script (via SSI) I am presently using. It works, yet it is printing the third entry from both lines. I need to extract/print the 3rd entry from the 2nd line only:

(may need to be completely rewritten)


#!/usr/bin/perl
#
# <!--#exec cgi="my_ssi_file.cgi" -->

use CGI::Carp qw(fatalsToBrowser);
use strict;

my $csvfile = "/home/public_html/cgi-bin/database/mycsvfile.csv";

print "Content-Type: text/html\n\n";

open (CSV, "< $csvfile");
while(<CSV>){
my $cols = (split(/;/))[3];
print $cols,"\n";
}
close CSV

[edited by: phranque at 9:36 am (utc) on Jan 5, 2011]
[edit reason] disable graphic smile faces [/edit]

 

janharders




msg:4249097
 8:40 pm on Jan 4, 2011 (gmt 0)

That sound simple enough.

change
open (CSV, "< $csvfile");
while(<CSV>){
my $cols = (split(/;/))[3];
print $cols,"\n";
}
close CSV;

to
open (CSV, "<", $csvfile);
my @lines = <CSV>;
my $cols = (split(/;/, $lines[2]))[2];
print $cols,"\n";
close CSV;

$lines[2] in the third line selects the row. starts at 0.

bodine




msg:4249117
 9:24 pm on Jan 4, 2011 (gmt 0)

I would change the $cols to an array, so you'd have access to all of the elements:

my @cols = split(/;/, $_);

Then, to grab only the second (or whatever) line, you could add an if statement:

if (2..2) {print $cols[2],"\n";}

Thus, the while block becomes:

while( <CSV> )
{
my @cols = split(/;/, $_);
if (2..2) {print $cols[2],"\n";}
}

If you need to print different lines, simply change the "2..2" to "1..3" (lines one to three), or "3..3" (line three), or whatever.

If you need to print more than one element of @cols, you can change $cols[2]:

print "$cols[0] lives in $cols[2], $cols[3] with the address of $cols[1].\n";

(You'd need to "chomp $cols[3];" to get rid of the newline char, if you want it all on one line.)

janharders




msg:4249129
 9:40 pm on Jan 4, 2011 (gmt 0)


if (2..2) {print $cols[2],"\n";}


that looks like very, very black magic but it actually works. I like it. I've only used ".." in for-loops, but perlop just opened my eyes to many other options.
Great idea (although I still think 2..2 look evil)!

bodine




msg:4249139
 9:56 pm on Jan 4, 2011 (gmt 0)

Oh, it is evil! It's perl! ;-)

See page 103-104 of the Camel book.

fredfletcher




msg:4249144
 10:17 pm on Jan 4, 2011 (gmt 0)

You guys are just simply the best! Thank you so much, I really appreciate this!

I've tried them all and they work very well; I will be using them both.

Again, a big THANK YOU :) and a Happy New Year!

fredfletcher




msg:4250129
 3:52 am on Jan 7, 2011 (gmt 0)

Hi again,

I have another question:

Is there a way to implement the time and/or date after ($cols[1]) for example.

And if so, would I be able to modify the date/time format?

The reason I ask for the different formats, is that I need a way to show the month in our both official languages in Canada, English and french.

I tried an SSI call <!--#exec cgi="/cgi-bin/hours_e.cgi" --> but that didn't work. Tried replacing the " with ' and that didn't work.

Fred

phranque




msg:4250143
 4:19 am on Jan 7, 2011 (gmt 0)

welcome to WebmasterWorld, Fred!

these references would be a good place to start.
perllocale:
http://perldoc.perl.org/perllocale.html [perldoc.perl.org]

localtime:
http://perldoc.perl.org/functions/localtime.html [perldoc.perl.org]

or...

DateTime:
http://search.cpan.org/~drolsky/DateTime-0.66/lib/DateTime.pm [search.cpan.org]

fredfletcher




msg:4250327
 4:56 pm on Jan 7, 2011 (gmt 0)

Thank you, it helped :)

Global Options:
 top home search open messages active posts  
 

Home / Forums Index / Code, Content, and Presentation / Perl Server Side CGI Scripting
rss feed

All trademarks and copyrights held by respective owners. Member comments are owned by the poster.
Home ¦ Free Tools ¦ Terms of Service ¦ Privacy Policy ¦ Report Problem ¦ About ¦ Library ¦ Newsletter
WebmasterWorld is a Developer Shed Community owned by Jim Boykin.
© Webmaster World 1996-2014 all rights reserved