我有一个来自 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,可以使用 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 documentation了解更多信息
关于php - 将大型分隔文件导入 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030808/