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

MySQL (एसिंक्रोनस और तेज़) में 200,00 पंक्तियों के साथ विशाल सीएसवी फ़ाइल कैसे आयात करें?

इस प्रश्न का उत्तर देने वाले सभी को धन्यवाद। मैंने एक समाधान खोजा है! बस इसे साझा करना चाहता था, अगर किसी को एक PHP स्क्रिप्ट बनाने की आवश्यकता होती है जो एक बड़ी CSV फ़ाइल को MySQL डेटाबेस में आयात करेगी (अतुल्यकालिक और तेज़!) मैंने 400,000 पंक्तियों के साथ अपने कोड का परीक्षण किया है और आयात किया जाता है सेकंड में। मेरा मानना ​​है कि यह बड़ी फ़ाइलों के साथ काम करेगा, आपको बस अधिकतम अपलोड फ़ाइल आकार को संशोधित करना होगा।

इस उदाहरण में, मैं एक CSV फ़ाइल आयात कर रहा हूँ जिसमें दो कॉलम (नाम, contact_number) शामिल हैं एक MySQL DB में जिसमें समान कॉलम हैं।

आपकी सीएसवी फ़ाइल इस तरह दिखनी चाहिए:

एना, 0906123489

जॉन, 0908989199

पीटर, 0908298392

...

...

तो, ये रहा समाधान।

सबसे पहले, अपनी टेबल बनाएं

CREATE TABLE `testdb`.`table_test`
( `id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(100) NOT NULL ,
`contact_number` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`id`)) ENGINE = InnoDB;

दूसरा, मेरे पास 4 PHP फ़ाइलें हैं। आपको बस इसे एक ही फोल्डर में रखना है। पीएचपी फाइलें इस प्रकार हैं:

index.php

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv" value="" />
<input type="submit" name="submit" value="Save" /></form>

कनेक्ट.php

<?php
//modify your connections here
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "testDB";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
?>

senddata.php

<?php
include('connect.php');
$data = $_POST['file'];
$handle = fopen($data, "r");
$test = file_get_contents($data);
if ($handle) {
    $counter = 0;
    //instead of executing query one by one,
    //let us prepare 1 SQL query that will insert all values from the batch
    $sql ="INSERT INTO table_test(name,contact_number) VALUES ";
    while (($line = fgets($handle)) !== false) {
      $sql .= "($line),";
      $counter++;
    }
    $sql = substr($sql, 0, strlen($sql) - 1);
     if ($conn->query($sql) === TRUE) {
    } else {
     }
    fclose($handle);
} else {  
} 
//unlink CSV file once already imported to DB to clear directory
unlink($data);
?>

upload.php

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script>
//Declaration of function that will insert data into database
 function senddata(filename){
        var file = filename;
        $.ajax({
            type: "POST",
            url: "senddata.php",
            data: {file},
            async: true,
            success: function(html){
                $("#result").html(html);
            }
        })
        }
 </script>
<?php
$csv = array();
$batchsize = 1000; //split huge CSV file by 1,000, you can modify this based on your needs
if($_FILES['csv']['error'] == 0){
    $name = $_FILES['csv']['name'];
    $ext = strtolower(end(explode('.', $_FILES['csv']['name'])));
    $tmpName = $_FILES['csv']['tmp_name'];
    if($ext === 'csv'){ //check if uploaded file is of CSV format
        if(($handle = fopen($tmpName, 'r')) !== FALSE) {
            set_time_limit(0);
            $row = 0;
            while(($data = fgetcsv($handle)) !== FALSE) {
                $col_count = count($data);
                //splitting of CSV file :
                if ($row % $batchsize == 0):
                    $file = fopen("minpoints$row.csv","w");
                endif;
                $csv[$row]['col1'] = $data[0];
                $csv[$row]['col2'] = $data[1];
                $min = $data[0];
                $points = $data[1];
                $json = "'$min', '$points'";
                fwrite($file,$json.PHP_EOL);
                //sending the splitted CSV files, batch by batch...
                if ($row % $batchsize == 0):
                    echo "<script> senddata('minpoints$row.csv'); </script>";
                endif;
                $row++; 
            }
            fclose($file);
            fclose($handle);
        }
    }
    else
    {
        echo "Only CSV files are allowed.";
    }
    //alert once done.
    echo "<script> alert('CSV imported!') </script>";
}
?>

इतना ही! आपके पास पहले से ही एक शुद्ध PHP स्क्रिप्ट है जो सेकंड में कई पंक्तियों को आयात कर सकती है! :)(मेरे साथी के लिए धन्यवाद जिन्होंने मुझे सिखाया और मुझे अजाक्स का उपयोग करने के बारे में एक विचार दिया)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django 1.11.4 . में त्रुटि ('datetime.datetime' ऑब्जेक्ट में कोई विशेषता नहीं है 'विभाजन')

  2. तिथि के साथ ऑपरेटर से अधिक का उपयोग कैसे करें?

  3. मैसकल:NOT EXISTS का प्रदर्शन। क्या प्रदर्शन में सुधार करना संभव है?

  4. स्पष्ट_डिफॉल्ट्स_for_timestamp को कैसे सक्षम करें?

  5. meta_query, संबंध या और और दोनों का उपयोग करके खोज कैसे करें?