从目录转储结构

时间:2016-01-05 16:19:01

标签: php mysql

我的数据库转储目录结构如下(总计:18,042,482个产品):

/home/nataliya/dump/10xxxxx/100xxxx/1000006/
/home/nataliya/dump/10xxxxx/100xxxx/1000007/
...

10000061000007是产品的id

每个文件夹包含:

description.txt (text)
details.csv (name, oldprice, price)
images.csv (url, size)

如何使用PHP将它们导入MySQL,如下所示:

id, name, oldprice, price, description (table `products`)
product_id, url, size (table `images`)

如果问题与本网站无关,我会提前道歉,并感谢所有希望帮助我的人。

编辑:为了澄清,我只是要求提供指导,而不是完整的代码示例。只是PHP的正常功能,这将使它具有良好的性能,因为我在谈论一个拥有超过3000万个文件的目录。

编辑:以下是我现在所做的事情:

<?php
function ArrayCSV($file) {
    $fh = fopen($file, 'r');

    while (!feof($fh) ) {
        $result[] = fgetcsv($fh, 1024);
    }

    fclose($fh);

    return $result[1];
}

$products = array();
$images = array();

foreach(scandir(dirname(__FILE__) . '/dump/') as $dir_global) {
    if($dir_global != '.' && $dir_global != '..' && $dir_global != '.DS_Store') {
        foreach(scandir(dirname(__FILE__) . '/dump/' . $dir_global) as $dir_local) {
            if($dir_local != '.' && $dir_local != '..' && $dir_local != '.DS_Store') {
                foreach(scandir(dirname(__FILE__) . '/dump/' . $dir_global . '/' . $dir_local) as $id) {
                    if($id != '.' && $id != '..' && $id != '.DS_Store') {
                        $dir = dirname(__FILE__) . '/dump/' . $dir_global . '/' . $dir_local . '/' . $id;

                        $product = ArrayCSV($dir . '/details.csv');
                        $image = ArrayCSV($dir . '/images.csv');

                        $products[] = array(
                            'id' => $id,
                            'name' => $product[0],
                            'oldprice' => $product[1],
                            'price' => $product[2],
                            'description' => file_get_contents($dir . '/description.txt')
                        );

                        $images[] = array(
                            'product_id' => $id,
                            'url' => $image[0],
                            'size' => $image[1]
                        );
                    }
                }
            }
        }
    }
}

try {
    $DBH = new PDO("mysql:host=localhost;dbname=application", 'root', '');
    $DBH->exec("SET NAMES utf8");
}
catch(PDOException $e) {
    //
}

foreach($products as $product) {
    $STH = $DBH->prepare("INSERT INTO products (id, name, oldprice, price, description) VALUES (:id, :name, :oldprice, :price, :description)");
    $STH->execute($product);
}

foreach($images as $image) {
    $STH = $DBH->prepare("INSERT INTO images (product_id, url, size) VALUES (:product_id, :url, :size)");
    $STH->execute($image);
}
?>

1 个答案:

答案 0 :(得分:0)

我建议您熟悉以下函数scandir()file_get_contents()以及PHP的所有mysqli函数,因为它们是您需要的关键在这里做。

希望这有帮助!