×
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Contact US

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

Problem parsing a CSV file

Problem parsing a CSV file

Problem parsing a CSV file

(OP)
I accidently placed this as a reply to another post and in the C forum.

I have a function which parses a CSV file then extracts records from that file and writes those records to another file. I pass references to the file handles to this function( a reference to $INFILE and $OUTFILE). When the function attempts to parse the CSV file I get the following parse error message: parse failed: No such file or directory. I am able to parse 2 other CSV files but this one particular generates this error message. Does anyone have any ideas on what could cause this parse error? Thanks
in advance for any help offered.

Here's the code:

In the main section:
my $INFILE = "/temp/info.txt";
my $OUTFILE = "/temp/master.txt";

open(IFILE, "$INFILE") || die "Can\'t open input file\n";
open(OFILE, "$OUTFILE") || die "Can\'t open output file\n";

# pass file handle references to function
writeToMasterFile(\*IFILE, \*OFILE);


# function
sub writeToMasterFile
{
     my ($f1, $f2) = @_;

     if ( -r $f1 )
  {
     print "File: $f1 exists and is readable\n";
  }
  else
  {
     print "File: $f1 does not exist and/or is not readable\n";
  }

  while (<$f1>)
  {
    chomp;
    my $csv2 = Text::CSV_XS->new;
    print "$_\n";
    if ( $csv2->parse($_))
    {
        my @mail_entry = $csv2->fields;
        my($accttype, $fname, $mname, $lname, $email, $pphone, $bphone, $address, $city, $state, $pcode, $province, $country, $comments, $refcocust, $refcoacct, $branch, $date, $time) = @mail_entry;     
        #print "\$date = $date\n\n";
        #print "\$time = $time\n\n";
        ($hr, $min, $sec) = split /:/, $time;
        ($mon, $day, $yr) = split /-/, $date;

        #print "\$hr = ", $hr, "\n";
        #print "\$min = ", $min, "\n";
        #print "\$sec = ", $sec, "\n\n";

        #print "\$mon = ", $mon, "\n";
        #print "\$day = ", $day, "\n";     
        #print "\$yr = ", $yr, "\n\n";
      
        if ( $mon == $ymon && $day == $yday && $yr == $yyr )
        {

            if ( $hr >= 12 )
            {
                print $f2 $_, "\n";
            }
            elsif ( $mon == $tmon && $day == $tday && $yr == $tyr )
            {
               if ( $hr < 12 )
               {
                  print $f2 $_, "\n";
               }
            }  
        }

    }
    else
    {
       bail("parse() failed: $!\n");
    }
  }
 
}
 

 

RE: Problem parsing a CSV file

If I were you, I would just pass the filename variables to the function and let it do the open() call, instead of passing the filehandles after they're already open.  I've had trouble in the past doing this by tring to pass an open error log file, so I just pass either the filename or an array to write to, and do the opening inside the function.  Maybe that will help.

Mike B.

RE: Problem parsing a CSV file

I posted a reply to this message in the C Forum which might shed some light.

Basically what I recommend is verifying that you have the correct permissions on the file. With certain permissions, the *nix environment will respond that there is no such file even if there is, because the user that the script is running as does not have permission to know that file exists.

Are both CSV files in the same directory?

If you are running the script from the web via apache, you will need to make sure the user 'nobody' or 'httpd' has permission to read the file, depending on your implementation.


Regards,
Gerald

RE: Problem parsing a CSV file

(OP)
Gerald, to answer your questions.

I retrieve 3 CSV files from 3 different servers on a farm. We are using Sun OS v5.7. This script runs as a cron job on a server that is not on the farm. The CSV files are obtained via FTP. All the CSV files end up in the same directory on the server which runs the script as a cron job. I will check the file permissions on the CSV file that gives me trouble.

RE: Problem parsing a CSV file

Something does not quite add up here...

Just for kicks and giggles, why dont you change:
open(OFILE, "$OUTFILE") || die "Can\'t open output file\n";

to

open(OFILE, ">$OUTFILE") || die "Can\'t open output file\n";
             ^ specifying that the file is opened to be written to...

Dont know about what is going on in your system, but in mine if I try to write to a file that was opened the way you opened $OUTFILE, I get a Bad file descriptor error...

Does /temp/master.txt already exist before you open it or are you trying to create the file?


Regards,
Gerald

RE: Problem parsing a CSV file

(OP)
Gerald

Sorry, $OUTFILE was supposed to be opened for writing. The master.txt file may exist before being written to. It is opened for appending records. It may contain records already.

RE: Problem parsing a CSV file

I would try doing 2 things.

First, before I use the open commands, I would test the filename with -e
if (-e $INFILE)

And immediately after each open statement I would print the value of $! and see where it is originating from.

The error that you are getting is not coming from the parse command, because it really doesnt know anything about files it just works with strings.

Whats happening is, it is trying to parse, but since the file cannot be found, open or read it is not getting any good strings to work with so it fails, but does not set $! to an error because it is not programmed that way. So parse is failing, and then you print out the value of $! which was more than likely set earlier by one of the open statements.

also remember that all filenames are case sensitive (except on windoze... tsk tsk :( )

Also I suppose it is possible that the No such file or directory error is entirely unrelated.

Try printing out the value of $csv2->error_input after the parse fails. This is normally set to the argument which parse could not handle when it crashes.

Regards,
Gerald


Red Flag This Post

Please let us know here why this post is inappropriate. Reasons such as off-topic, duplicates, flames, illegal, vulgar, or students posting their homework.

Red Flag Submitted

Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
The Tek-Tips staff will check this out and take appropriate action.

Reply To This Thread

Posting in the Tek-Tips forums is a member-only feature.

Click Here to join Tek-Tips and talk with other members! Already a Member? Login


Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close