非常大的.csv文件。转换为数组并使用,或插入Databsase

时间:2016-09-20 14:22:42

标签: php sql csv

我有一个非常大的.csv文件,我从网站下载以填充在线商店。 (4千个条目,每个10个字段)

我需要能够操纵数据(按价格排序,按类别显示等)。

是否有关于如何处理此数据量的标准做法?

读取.csv文件并将其转换为数组非常慢。

似乎最好只将所有数据插入到SQL表中,然后像往常一样使用它,但我必须每隔几天重新填充一次。

我可以将数组直接保存到磁盘,它会比表快吗?

2 个答案:

答案 0 :(得分:2)

假设您正在使用MySQL,您可以查看LOAD DATA INFILE。类似的东西:

LOAD DATA INFILE 'path/to/your/file.csv' INTO your_table;

如果需要,您可以使用FIELDS TERMINATED BYLINES TERMINATED BY指定行和字段分隔符。

在您需要查询的字段上创建索引。

在旁注中,4000个条目每个10个字段实际上是一个非常小的数据集 - 除非当然每个字段都是1G blob。

答案 1 :(得分:0)

您可以执行以下操作..

<?php

try{

$handler = fopen('pathtoFile','r');
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO YOURTABLE(firstname, lastname, email) VALUES (:firstname, :lastname, :email)");

$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);

while( ( $row = fgetcsv($handler,1000) ) !== FALSE ){

    // insert a row
    $firstname = $row[0];
    $lastname = $row[1];
    $email = $row[2];
    $stmt->execute();

}

} catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;

使用PDO是一种很好的做法......你可以尝试它的速度。只要您的CSV不超过50,000个我分享给您的脚本,您就可以完美地工作。

如果您的CSV文件不是那么大,则无需使用LOAD DATA INFILE。特别是如果你想在从CSV获取数据时插入数据之前做额外的工作。