我有一个非常大的.csv文件,我从网站下载以填充在线商店。 (4千个条目,每个10个字段)
我需要能够操纵数据(按价格排序,按类别显示等)。
是否有关于如何处理此数据量的标准做法?
读取.csv文件并将其转换为数组非常慢。
似乎最好只将所有数据插入到SQL表中,然后像往常一样使用它,但我必须每隔几天重新填充一次。
我可以将数组直接保存到磁盘,它会比表快吗?
答案 0 :(得分:2)
假设您正在使用MySQL,您可以查看LOAD DATA INFILE
。类似的东西:
LOAD DATA INFILE 'path/to/your/file.csv' INTO your_table;
如果需要,您可以使用FIELDS TERMINATED BY
和LINES 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获取数据时插入数据之前做额外的工作。