Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để nhập tệp CSV khổng lồ với 200,00 hàng vào MySQL (không đồng bộ và nhanh chóng)?

Cảm ơn tất cả những người đã đưa ra câu trả lời cho câu hỏi này. Tôi đã phát hiện ra một giải pháp! Tôi chỉ muốn chia sẻ nó, trong trường hợp ai đó cần tạo một tập lệnh PHP sẽ nhập một tệp CSV khổng lồ vào cơ sở dữ liệu MySQL (không đồng bộ và nhanh chóng!) Tôi đã kiểm tra mã của mình với 400.000 hàng và quá trình nhập đã hoàn tất trong vài giây. Tôi tin rằng nó sẽ hoạt động với các tệp lớn hơn, bạn chỉ cần sửa đổi kích thước tệp tải lên tối đa.

Trong ví dụ này, tôi sẽ nhập tệp CSV có chứa hai cột (tên, số liên lạc) vào Cơ sở dữ liệu MySQL có chứa các cột giống nhau.

Tệp CSV của bạn sẽ trông giống như sau:

Ana, 0906123489

John, 0908989199

Peter, 0908298392

...

...

Vì vậy, đây là giải pháp.

Đầu tiên, hãy tạo bảng của bạn

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;

Thứ hai, tôi có 4 tệp PHP. Tất cả những gì bạn phải làm là đặt nó vào một thư mục duy nhất. Các tệp PHP như sau:

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>

connect.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>";
}
?>

Đó là nó! Bạn đã có một tập lệnh PHP thuần túy có thể nhập nhiều hàng trong vài giây! :) (Cảm ơn đối tác của tôi đã dạy và cho tôi ý tưởng về cách sử dụng ajax)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pdo chèn hình ảnh trực tiếp vào cơ sở dữ liệu - luôn chèn BLOB - 0B

  2. Bài hát hùng hồn ở đâu trong tất cả

  3. Tải DATA mà không có tệp (tức là trong bộ nhớ) có khả thi cho MySQL và Java không?

  4. Cơ sở dữ liệu so sánh MySQL

  5. Xác định xem một câu lệnh sql có bắt đầu bằng từ SELECT hay không