我必须编写一个PHP脚本,该脚本将从给定的CSV文件中将数据导入MySQL数据库。给定的CSV文件最多可以包含200,000行。我尝试了以下方法,但出现了问题:
现在,我正在考虑通过将CSV文件拆分为较小的块,然后异步插入它们的解决方案。我已经完成了CSV的拆分,但是目前不知道如何以快速安全的方式异步插入到数据库中。但是我听说我将在这里使用Ajax。
您可以推荐任何解决方案吗?在此先多谢!
感谢所有为这个问题提供答案的人。我发现了解决方案!我只是想共享它,以防万一有人需要创建一个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的想法)
问题内容: 我有一个CSV文件。它包含140万行数据,因此我无法在Excel中打开该csv文件,因为其限制约为100万行。 因此,我想将此文件导入MySQL工作台中。此csv文件包含以下列 我正在尝试在MySQL工作台中创建一个名为“虚拟”的表,其中包含诸如 CSV文件名为。我在工作台中的代码是这样的: 但我收到类似的错误 问题答案: 我想您缺少ENCLOSED BY子句 并指定csv文件的完整路
如何将CSV文件导入MySQL表?我想把第一行数据用作列名。 我读到如何将CSV文件导入MySQL表?,但是唯一的答案是使用GUI而不是shell?
我有一个csv文件,它一直增长到大约48M行。 在向它添加新行之前,我需要阅读最后一行。 我尝试了下面的代码,但它太慢了,我需要一个更快的替代方案:
问题内容: 我想将csv文件导入到mysql中。 http://www.tech- recipes.com/rx/2345/import_csv_file_direct_into_mysql/ 但是csv中的列名称与数据库表中的列名称不同,我该怎么办?我想以编程方式来做。 问题答案: 您可以创建一个脚本来解析您的csv文件并将数据放入db。 就像是:
假设我们有 2 个实体: 人实体-有2个属性person_id(手动输入)和名字 地址实体-有2个属性address_id(自动增量)和街道名称 每个Person都有一个地址(OneToOne关系)。因此地址实体将有一个外键(person_id)指向其关联的Person。您有什么建议? 到目前为止,我只找到了一种不用关系管理就能把单个实体导入mysql的方法:
问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离