sql >> Database teknologi >  >> RDS >> Mysql

Hvordan importerer man stor CSV-fil med 200,00 rækker til MySQL (asynkron og hurtig)?

Tak til alle, der har givet svar på dette spørgsmål. Jeg har opdaget en løsning! Ville bare dele den, hvis nogen skulle have brug for at oprette et PHP-script, der importerer en enorm CSV-fil til MySQL-databasen (asynkront og hurtigt!) Jeg har testet min kode med 400.000 rækker, og importen er færdig. på sekunder. Jeg tror, ​​det ville fungere med større filer, du skal bare ændre den maksimale uploadfilstørrelse.

I dette eksempel vil jeg importere en CSV-fil, der indeholder to kolonner (navn, kontaktnummer) til en MySQL DB, der indeholder de samme kolonner.

Din CSV-fil skulle se sådan ud:

Ana, 0906123489

John, 0908989199

Peter, 0908298392

...

...

Så her er løsningen.

Først skal du oprette din tabel

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;

For det andet har jeg 4 PHP-filer. Alt du skal gøre er at placere dette i en enkelt mappe. PHP-filer er som følger:

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

Det er det! Du har allerede et rent PHP-script, der kan importere flere rækker på få sekunder! :)(Tak til min partner, som underviste og gav mig en idé om, hvordan man bruger ajax)



  1. FEJL 1064 (42000):Du har en fejl i din SQL-syntaks; tjek den manual, der svarer til din MySQL-serverversion, for at se den rigtige syntaks at bruge

  2. Hvordan PERIOD_ADD() virker i MariaDB

  3. Sådan fungerer LPAD() i MariaDB

  4. Sådan pivoterer du dynamisk med dato som kolonne