Php 将大型分隔文件导入MySQL表

Php 将大型分隔文件导入MySQL表,php,mysql,delimited-text,Php,Mysql,Delimited Text,我从网站上得到了这个大文件(格式奇怪的txt文件)。它是NUT_DATA.txt文件 但问题是它几乎是27mb!我成功地导入了其他一些较小的文件,但我的方法是使用文件获取内容,这就是为什么如果我尝试拦截27+mb的RAM,就会抛出错误的原因 那么,如何将这个庞大的文件导入MySQL数据库,而不出现超时和RAM问题呢?我试着一次只从文件中获取一行,但是遇到了超时问题 使用PHP5.2.0 这是一个旧脚本(数据库中的字段只是数字,因为我不知道什么数字代表什么营养素,我发现这个数据非常糟糕。很抱歉代码

我从网站上得到了这个大文件(格式奇怪的txt文件)。它是NUT_DATA.txt文件

但问题是它几乎是27mb!我成功地导入了其他一些较小的文件,但我的方法是使用
文件获取内容
,这就是为什么如果我尝试拦截27+mb的RAM,就会抛出错误的原因

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

使用PHP5.2.0

这是一个旧脚本(数据库中的字段只是数字,因为我不知道什么数字代表什么营养素,我发现这个数据非常糟糕。很抱歉代码太难看了):


您可以通过在
php.ini
中设置此值来增加每个脚本可以使用的内存量:

memory_limit = 64M  

说到这里:你必须使用PHP吗?其他脚本语言(如python)可能更适合此类任务。

您可以通过在
php.ini
中设置此值来增加每个脚本可以使用的内存量:

memory_limit = 64M  

说到这里:你必须使用PHP吗?其他脚本语言(如python)可能更适合此类任务。

逐行读取文件,这样就不会在内存中加载整个文件。使用

set_time_limit(0);
避免脚本超时


逐行读取文件,这样就不会将整个文件加载到内存中。使用

set_time_limit(0);
避免脚本超时


如果必须使用PHP,可以使用
fopen
fgets

<?

$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以了解更多信息

如果必须使用PHP,可以使用
fopen
fgets

<?

$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以了解更多信息

PHP适合这样的任务!PHP适合这样的任务!我不知道PHP,但我认为如果你能读几行代码,然后立即将它们插入数据库,然后读取下一行代码直到EOF…最好的方法是使用加载数据(请参阅),当然这不是PHP,但加载它也不会花费数小时。谢谢大家,但是它是共享主机,我没有MySQL的完全访问权限,也没有PHP以外的任何其他脚本语言。我不知道PHP,但我认为如果你能读几行代码,然后立即将它们插入数据库,然后读取下一行代码直到EOF…最好的方法是使用LOAD DATA(请参阅)当然,这不是PHP,但加载它也不需要几个小时。谢谢大家,但它是共享主机,我没有对MySQL的完全访问权限,也没有对PHP以外的任何其他脚本语言的访问权限。使用它,设置时间限制,耐心等待,我成功地在数据库中获取了整个文件。现在我只需要找出数据中的内容:)使用这个,设置时间限制,耐心等待,我成功地在数据库中获取了整个文件。现在,我只需要找出数据中的内容:)