php - 将大型分隔文件导入 MySQL 表

标签 php mysql csv

我有一个来自 USDA's 的大(且格式奇怪的 txt 文件)网站。它是 NUT_DATA.txt 文件。

但问题是它差不多有27mb!我成功导入了其他一些较小的文件,但我的方法是使用 file_get_contents ,这就是为什么如果我尝试获取 27+ mb 的 RAM 时会抛出错误的原因。

那么如何才能将这个庞大的文件导入到我的 MySQL 数据库而不遇到超时和 RAM 问题呢?我尝试一次从文件中获取一行,但这遇到了超时问题。

使用 PHP 5.2.0。

这是旧脚本(数据库中的字段只是数字,因为我无法弄清楚什么数字代表什么营养素,我发现这个数据文档非常糟糕。对代码的丑陋感到抱歉):

<?

    $file = "NUT_DATA.txt";

    $data = split("\n", file_get_contents($file)); // split each line

    $link = mysql_connect("localhost", "username", "password");
    mysql_select_db("database", $link);

    for($i = 0, $e = sizeof($data); $i < $e; $i++)
    {
        $sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES(";
        $row = split("\^", trim($data[$i])); // split each line by carrot
        for ($j = 0, $k = sizeof($row); $j < $k; $j++) {
            $val = trim($row[$j], '~');
            $val = (empty($val)) ? 0 : $val;
            $sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s
        }
        $sql = rtrim($sql, ',') . ");";
        mysql_query($sql) or die(mysql_error()); // query the db
    }

    echo "Finished inserting data into database.\n";

    mysql_close($link);

?>

最佳答案

如果必须使用 PHP,可以使用 fopenfgets 逐行读取文件

<?

$file = "NUT_DATA.txt";
$fh = @fopen( $file, "r" );    // open the file for reading
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("database", $link);

while( !feof( $fh ) )
{
    $data = fgets( $fh, 4096 );     // read line from file

    $sql = "INSERT INTO `USDA` (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) VALUES(";
    $row = split("\^", trim($data)); // split each line by carrot
    for ($j = 0, $k = sizeof($row); $j < $k; $j++) {
        $val = trim($row[$j], '~');
        $val = (empty($val)) ? 0 : $val;
        $sql .= ((empty($val)) ? 0 : $val) . ','; // this gets rid of those tildas and replaces empty strings with 0s
    }
    $sql = rtrim($sql, ',') . ");";
    mysql_query($sql) or die(mysql_error()); // query the db
}

echo "Finished inserting data into database.\n";

fclose( $fh );

mysql_close($link);

?>

查看 fgets documentation了解更多信息

关于php - 将大型分隔文件导入 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030808/

相关文章:

php - 如何将基于页面的 PHP 应用程序转换为 MVC?

php - 维基百科 Curl 请求错误

mysql - 如果mysql上只有数据则显示数据总和

javascript - 我想在表中显示以下数据

mysql - 如何从 csv 文件将外键分配给 MySQL 表?

php - 使用 php 将 mysql 查询导出到可下载的 .csv 文件

php - 当页面第一次加载时触发事件,此后没有其他时间

php - Matt Kruse 的 javascript 日期排序未正确排序

php - MySQL/PDO - 从其他表中选择(Join 语句)

linux - xls2csv + 禁用 XLS 中的空格