Re: Re: txt to db, file() bug?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hmmm.  thanks for this.  the file actually does not have quoted entries
between the commas.  it is just:
text,text,text ..... ,text \n

that does not take away from the assitance...gives me more things to think
about.

thank you.
jeff


                                                                                                                                       
                      Justin Patrin                                                                                                    
                      <jpatrin@pnicorp.        To:       php-db@lists.php.net                                                          
                      com>                     cc:                                                                                     
                                               Subject:   Re: txt to db, file() bug?                                           
                      10/23/2003 04:19                                                                                                 
                      PM                                                                                                               
                                                                                                                                       
                                                                                                                                       




You may be having problems with your delimiter (,) being within quotes.
This can be a problem both for your ',' splitting and for the file()
splitting (\n). fgetcsv() seems to do some of this, but I'm not sure of
its completeness. Here's a function I wrote and some possible code for you:

/**
  * does a regular split, but also accounts for the deliminator to be
within quoted fields
  *  for example, if called as such:
  *   splitQuoteFriendly(',', '0,1,2,"3,I am still 3",4');
  *  it will return:
  *   array(0 => '0',
  *         1 => '1',
  *         2 => '2',
  *         3 => '"3,I am still 3"',
  *         4 => '4');
  * @param string deliminator to split by
  * @param string text to split
  * @param string text which surrounds quoted fields (defaults to ")
  * @return array array of fields after split
  */
function splitQuoteFriendly($delim, $text, $quote = '"') {
   $strictFields = split($delim, $text);
   for($sl = 0, $l = 0; $sl < sizeof($strictFields); ++$sl) {
     $fields[$l] = $strictFields[$sl];
     $numQuotes = 0;
     while(fmod($numQuotes += substr_count($strictFields[$sl], $quote),
2) == 1) {
       ++$sl;
       $fields[$l] .= $delim.$strictFields[$sl];
     }
     ++$l;
   }

   return $fields;
}

$text = file_get_contents($filename);
$lines = splitQuoteFriendly("\n", $text, "'");
foreach($lines as $line) {
   $parts = splitQuoteFriendly(',', $line, "'");
}


Justin Patrin


Jeffrey N Dyke wrote:

> OS Solaris8
> php4.3.2 and php 4.2.3.  running as CLI from cron and command line.
>
> I have a log file that i'm processing that i need to in turn insert only
> certian fields into the database.  I open the files using
> file(filename.csv),which returns the array for me to process.  i process
> all the lines of the file with:
> while(list($line_number, line) = each($fp)) {
>       $line_array = explode(",",$line);
> etc....
>
> There are 15 comma seperated 'columns' in the csv file, of which i only
> need to input 6.  every once in a while i don't get all of the data
within
> the fields, or the comma (,) becomes part of the field.  But then the
other
> 95% of the rows process correctly.
>
> Below is some sample data, i'm happy to provide more to anyone with
> questions.  thansk for any opinions.  I hope this makes [some] sense.
>
> Jeff
>
> The assignment of the values that i'm putting into my queries are
> simply....
>
> $query = "INSERT INTO TA_RAFEED_JD SET ".
>            "LoggedAt = '".$line_array[0]. "', ".
>            "User_Name = '".$line_array[2]."', ".
>            "Network_Device_Group = '".$line_array[3]."', ".
>            "Group_Name = 'Dial', ".
>        "Caller_Id = '".$line_array[4]. "', ".
>           "elapsed_time = ".$line_array[6];
>
> trims 0's off values and changes them.???
> ------------ Good log line prior to error'd line--------------
> Log File--
>
10/22/2003,07:34:23,000512,Dial-VPN,5022278197/8885326281,stop,2135,ppp,56671,46034,581,243,89602,192.168.98.218,Async190,10.1.1.28,

> DB Query - INSERT INTO TA_RAFEED_JD SET LoggedAt = '2003-10-22',
User_Name
> = '000512', Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial',
> Caller_Id = '5022278197/8885326281', elapsed_time = 2135
> ------------ trimmed the two leading zeros off the string 002375 and made
> it 22375-------
> LogFile --
>
10/22/2003,07:34:42,002375,Dial-VPN,7877910505/8885326281,stop,1055,ppp,150304,196686,419,317,89607,192.168.98.115,Async55,10.1.1.28,

> Db query -- INSERT INTO TA_RAFEED_JD SET LoggedAt = '2003-10-22',
User_Name
> = '22375', Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial',
> Caller_Id = '7877910505/8885326281', elapsed_time = 1055
> ----------same as above ------
>
10/22/2003,16:52:59,007138,Dial-VPN,2122011073/8885326281,stop,205,ppp,28543,51643,171,113,89784,192.168.98.232,Async100,10.1.1.28,

> INSERT INTO TA_RAFEED_JD SET LoggedAt = '2003-10-22', User_Name
= '17138',
> Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial', Caller_Id
> = '2122011073/8885326281', elapsed_time = 205
>
> chooses the WRONG value..the value that its putting in the 'User_Name'
> field is a contatenation of other fields, not being processed.???
> ----correct line prior to error --
>
10/22/2003,08:02:21,002357,Dial-VPN,5072878991/8885326281,stop,3580,ppp,650218,6754168,6947,6858,89604,192.168.98.65,Async23,10.1.1.28,INSERT

>  I
> NTO TA_RAFEED_JD SET LoggedAt = '2004-10-22', User_Name = '002357',
> Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial', Caller_Id
= '507287
> 8991/8885326281', elapsed_time = 3580
> ------errord record -- instead of inserting ka1497 to 'User_Name' i got
> 'stop7'--
>
10/22/2003,08:17:50,ka1497,Dial-VPN,4169249221/8885326281,stop,5127,ppp,738105,4533604,4701,4603,89600,192.168.98.85,Async186,10.1.1.28,INSERT

> INTO TA_RAFEED_JD SET LoggedAt = '2003-10-22', User_Name = 'stop7',
> Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial', Caller_Id
= '416924
> 9221/8885326281', elapsed_time = 5127
> ----same as above.  inserted stop1 instead of 001691-----
>
10/22/2003,12:02:19,001691,Dial-VPN,4142713011/8885326281,stop,754,ppp,65008,243490,419,365,89696,192.168.98.114,Async124,10.1.1.28,INSERT

>  INTO
>  TA_RAFEED_JD SET LoggedAt = '2003-10-22', User_Name = 'stop1',
> Network_Device_Group = 'Dial-VPN', Group_Name = 'Dial', Caller_Id
> = '4142713011
> /8885326281', elapsed_time = 754
>
>
> if you've got this far...again.  thank you!

--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux