इस प्रश्न का उत्तर देने वाले सभी को धन्यवाद। मैंने एक समाधान खोजा है! बस इसे साझा करना चाहता था, अगर किसी को एक 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 स्क्रिप्ट है जो सेकंड में कई पंक्तियों को आयात कर सकती है! :)(मेरे साथी के लिए धन्यवाद जिन्होंने मुझे सिखाया और मुझे अजाक्स का उपयोग करने के बारे में एक विचार दिया)