Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP में 100k+ लाइनों के साथ CSV को कैसे संसाधित करें?

कुछ इस तरह (कृपया ध्यान दें कि यह 100% अप्रयुक्त है और मेरे सिर के ऊपर से वास्तव में काम करने के लिए कुछ ट्विकिंग की आवश्यकता हो सकती है :))

//define array may (probably better ways of doing this
$stocks = array(
    1  => 22,
    2  => 23,
    3  => 24,
    4  => 25,
    5  => 26,
    6  => 27,
    7  => 28,
    8  => 29,
    9  => 30,
    10 => 31
);

$handle = fopen("file.csv", "r")); //open file
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    //loop through csv

    $updatesql = "UPDATE t SET `value` = ".$data[2]." WHERE   fielddef_id = ".$stocks[$data[0]]." AND product_id = ".$data[1];
   echo "$updatesql<br>";//for debug only comment out on live
}

अपना प्रारंभिक चयन करने की कोई आवश्यकता नहीं है क्योंकि आप अपने कोड में वैसे भी केवल अपने उत्पाद डेटा को 1 पर सेट कर रहे हैं और यह आपके विवरण से दिखता है कि आपकी उत्पाद आईडी हमेशा सही होती है, यह केवल आपके फ़ील्डडेफ़ कॉलम में होता है जिसमें नक्शा होता है।

इसके अलावा केवल लाइव के लिए अपने वास्तविक mysqli निष्पादन कमांड को अपने $updatesql पर डालना न भूलें;

आपको वास्तविक उपयोग कोड की तुलना करने के लिए (मैं इसके खिलाफ बेंचमार्क कर सकता हूं!) यह कुछ कोड है जिसका उपयोग मैं एक अपलोड की गई फ़ाइल के आयातक के लिए करता हूं (यह सही नहीं है लेकिन यह अपना काम करता है)

if (isset($_POST['action']) && $_POST['action']=="beginimport") {
            echo "<h4>Starting Import</h4><br />";
            // Ignore user abort and expand time limit 
            //ignore_user_abort(true);
            set_time_limit(60);
                if (($handle = fopen($_FILES['clientimport']['tmp_name'], "r")) !== FALSE) {
                    $row = 0;
                    //defaults 
                    $sitetype = 3;
                    $sitestatus = 1;
                    $startdate = "2013-01-01 00:00:00";
                    $enddate = "2013-12-31 23:59:59";
                    $createdby = 1;
                    //loop and insert
                    while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {  // loop through each line of CSV. Returns array of that line each time so we can hard reference it if we want.
                        if ($row>0) {
                            if (strlen($data[1])>0) {
                                $clientshortcode = mysqli_real_escape_string($db->mysqli,trim(stripslashes($data[0])));
                                $sitename = mysqli_real_escape_string($db->mysqli,trim(stripslashes($data[0]))." ".trim(stripslashes($data[1])));
                                $address = mysqli_real_escape_string($db->mysqli,trim(stripslashes($data[1])).",".trim(stripslashes($data[2])).",".trim(stripslashes($data[3])));
                                $postcode = mysqli_real_escape_string($db->mysqli,trim(stripslashes($data[4])));
                                //look up client ID
                                $client = $db->queryUniqueObject("SELECT ID FROM tblclients WHERE ShortCode='$clientshortcode'",ENABLE_DEBUG);

                                if ($client->ID>0 && is_numeric($client->ID)) {
                                    //got client ID so now check if site already exists we can trust the site name here since we only care about double matching against already imported sites.
                                    $sitecount = $db->countOf("tblsites","SiteName='$sitename'");
                                    if ($sitecount>0) {
                                        //site exists
                                        echo "<strong style=\"color:orange;\">SITE $sitename ALREADY EXISTS SKIPPING</strong><br />";
                                    } else {
                                        //site doesn't exist so do import
                                        $db->execute("INSERT INTO tblsites (SiteName,SiteAddress,SitePostcode,SiteType,SiteStatus,CreatedBy,StartDate,EndDate,CompanyID) VALUES 
                                        ('$sitename','$address','$postcode',$sitetype,$sitestatus,$createdby,'$startdate','$enddate',".$client->ID.")",ENABLE_DEBUG);
                                        echo "IMPORTED - ".$data[0]." - ".$data[1]."<br />";
                                    }
                                } else {
                                    echo "<strong style=\"color:red;\">CLIENT $clientshortcode NOT FOUND PLEASE ENTER AND RE-IMPORT</strong><br />";
                                }
                                fcflush();
                                set_time_limit(60); // reset timer on loop
                            }
                        } else {
                            $row++;
                        }
                    } 
                    echo "<br />COMPLETED<br />";
                }
                fclose($handle);
                unlink($_FILES['clientimport']['tmp_name']);
            echo "All Imports finished do not reload this page";
        }

इसने लगभग 10 सेकंड में 150k पंक्तियों को आयात किया



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एकाधिक SQL फ़ाइलों से SQL को पुनर्स्थापित करना

  2. MySQL डेटा को अलग HTML टेबल में वर्गीकृत करना?

  3. फ़ाइल या असेंबली लोड नहीं कर सका 'सिस्टम। उत्पादन डेटाबेस पर एप्लिकेशन को तैनात करते समय डेटा त्रुटि'

  4. डेटाबेस/एसक्यूएल:देशांतर/अक्षांश डेटा कैसे स्टोर करें?

  5. mysql सबक्वेरी में अज्ञात कॉलम