如何将具有200,00行的巨大CSV文件导入MySQL(异步且快速)?

米德·乌曼达(Mead Umandal)

我必须编写一个PHP脚本,它将脚本从给定的CSV文件导入MySQL数据库。给定的CSV文件最多可以包含200,000行。我尝试了以下方法,但出现了问题:

  1. LOAD DATA LOCAL INFILE:我不能使用LOAD DATA LOCAL INFILE语句,因为我想在上载行之前先进行一些验证,此外,我们的数据库管理员不希望我使用该语句,我也不知道为什么。
  2. FOR LOOP:在FOR循环中逐行插入将花费太多时间,从而导致连接超时。

现在,我正在考虑通过将CSV文件拆分为较小的块,然后异步插入它们的解决方案。我已经完成了CSV的拆分,但是目前不知道如何以快速安全的方式异步插入数据库。但是我听说我将在这里使用Ajax。

您可以推荐任何解决方案吗?在此先多谢!

米德·乌曼达(Mead Umandal)

感谢所有为这个问题提供答案的人。我发现了解决方案!我只是想分享它,以防万一有人需要创建一个PHP脚本来将一个巨大的CSV文件导入到MySQL数据库中(异步且快速!),我已经测试了40万行代码,并在几秒钟内完成了导入。我相信它将适用于较大的文件,您只需要修改最大上传文件大小即可。

在此示例中,我将一个包含两列(名称,contact_number)的CSV文件导入到包含相同列的MySQL数据库中。

您的CSV文件应如下所示:

安娜,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文件。您所要做的就是将其放入单个文件夹中。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>

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

而已!您已经有一个纯PHP脚本,可以在几秒钟内导入多个行!:)(感谢我的伴侣教给我有关如何使用ajax的想法)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将具有大量列数的csv文件导入Apache Spark 2.0

来自分类Dev

将具有奇数行的CSV导入MySQL

来自分类Dev

如何将包含反斜杠的csv文件导入MySQL

来自分类Dev

如何将巨大的字符行拆分为具有相等列数的几行?

来自分类Dev

如何将GTFS文件导入MySQL?

来自分类Dev

如何快速将非常大的csv文件导入mysql?

来自分类Dev

如何将多个巨大的 csv(具有不同的列)加载到 AWS S3 中

来自分类Dev

如何将具有现有文件的本地项目导入到“源代码树”

来自分类Dev

如何快速获取巨大的csv文件的最后一行(48M行)?

来自分类Dev

如何将具有目录结构的文件导入Visual Studio 2013

来自分类Dev

如何将具有内部功能的m文件导入simulink?

来自分类Dev

如何将CSV文件导入到SQLite的第一行除外?

来自分类Dev

如何使用bash将所有csv文件的前200行保存在目录中?

来自分类Dev

如何将具有1x1结构的.mat文件转换为.csv文件?

来自分类Dev

如何将文件中具有相同值的所有行保存到文件中

来自分类Dev

如何将CSV文件导入SQL PLUS?

来自分类Dev

如何将3000个CSV文件导入SQLite DB?

来自分类Dev

如果值包含逗号,如何将CSV导入mysql

来自分类Dev

如何将txt文件拆分为多个文件,但不包含具有某些内容的行

来自分类Dev

如何将火花数据输出到具有单独列的csv文件?

来自分类Dev

如何将具有简单结构的xml文件转换为csv?

来自分类Dev

如何导入具有以单独字符结尾的行的csv?

来自分类Dev

如何将多个.sql文件导入MySQL?

来自分类Dev

如何将yml文件导入MySQL数据库?

来自分类Dev

如何将多个.sql文件导入MySQL?

来自分类Dev

如何将一行从文件导入变量?(PHP)

来自分类Dev

如何将巨大的CSV文件一次插入python的SQL Server中?

来自分类Dev

如何将Objective-C文件添加/导入到快速应用程序

来自分类Dev

如何将查询结果保存到mysql中具有列名的excel文件中

Related 相关文章

  1. 1

    如何将具有大量列数的csv文件导入Apache Spark 2.0

  2. 2

    将具有奇数行的CSV导入MySQL

  3. 3

    如何将包含反斜杠的csv文件导入MySQL

  4. 4

    如何将巨大的字符行拆分为具有相等列数的几行?

  5. 5

    如何将GTFS文件导入MySQL?

  6. 6

    如何快速将非常大的csv文件导入mysql?

  7. 7

    如何将多个巨大的 csv(具有不同的列)加载到 AWS S3 中

  8. 8

    如何将具有现有文件的本地项目导入到“源代码树”

  9. 9

    如何快速获取巨大的csv文件的最后一行(48M行)?

  10. 10

    如何将具有目录结构的文件导入Visual Studio 2013

  11. 11

    如何将具有内部功能的m文件导入simulink?

  12. 12

    如何将CSV文件导入到SQLite的第一行除外?

  13. 13

    如何使用bash将所有csv文件的前200行保存在目录中?

  14. 14

    如何将具有1x1结构的.mat文件转换为.csv文件?

  15. 15

    如何将文件中具有相同值的所有行保存到文件中

  16. 16

    如何将CSV文件导入SQL PLUS?

  17. 17

    如何将3000个CSV文件导入SQLite DB?

  18. 18

    如果值包含逗号,如何将CSV导入mysql

  19. 19

    如何将txt文件拆分为多个文件,但不包含具有某些内容的行

  20. 20

    如何将火花数据输出到具有单独列的csv文件?

  21. 21

    如何将具有简单结构的xml文件转换为csv?

  22. 22

    如何导入具有以单独字符结尾的行的csv?

  23. 23

    如何将多个.sql文件导入MySQL?

  24. 24

    如何将yml文件导入MySQL数据库?

  25. 25

    如何将多个.sql文件导入MySQL?

  26. 26

    如何将一行从文件导入变量?(PHP)

  27. 27

    如何将巨大的CSV文件一次插入python的SQL Server中?

  28. 28

    如何将Objective-C文件添加/导入到快速应用程序

  29. 29

    如何将查询结果保存到mysql中具有列名的excel文件中

热门标签

归档