我可以轻松使用格式清晰的CSV和制表符分隔的文本文件。不幸的是,我被赋予了格式错误的文本文件以插入我的mySQL数据库。我有数据插页只是将文本文件的读入排序,导致我的问题。阅读文件的小版本工作正常,但全尺寸(40mb)导致我超时。如果可能的话,我热衷于逐行阅读。
文本文件内容示例:
62800, ,PRODUCT TITLE, BRAND NAME, XXX.XX, XXX.XX, DESCRIPTION OF
PRODUCT GOES HERE BUT IT DOES FALL ON TO MULTIPLE LINES~ WITH TILDAS INSTEAD OF COMMAS FOR THE MAIN TEXT AND NEW LINES A
T RANDOM POINTS{}
" {}"表示记录的结束,并在整个文档中重复。
我现有的脚本按此分割(" {}"),但创建了一个数组,我认为这是它倒下的地方。因为数据太大了。
现有代码:
$handle = @fopen("WEBDATA2-2.txt", "r"); // productsample..txt
if ($handle) {
while (($buffer = fgets($handle)) !== false) {
$temp_product .= $buffer;
// If end of file - exit loop
if(strpos($temp_product, 'END-OF-FILE') !== false) break;
$nlcheck = trim(substr($temp_product, -2));
//echo $nlcheck."<br>";
if ($nlcheck=="{}" || $nlcheck=="}") {
$products[]=explode(',',$temp_product);
$temp_product="";
}
}
fclose($handle);
}
我不确定如何最好地解释这个问题。如果我能提供更多信息,请告诉我。
答案 0 :(得分:1)
您可以预先处理该文件。如果每个产品以{}结尾,这应该可以解决问题:
perl -p -i -e 's/([^}])\n/$1/' foo.txt
要解释一下,perl
正在搜索任何不以&#34;}&#34;开头的行结尾。并删除它。
答案 1 :(得分:0)
这是否符合您的需求?
if (false !== ($handle = @fopen('WEBDATA2-2.txt', 'r'))) {
ignore_user_abort(true);
set_time_limit(0);
$buffer = '';
while (false !== ($line = fgets($handle))) {
$buffer .= $line;
if ('{}' === substr($buffer, -2)) {
$product = explode(',', $buffer);
// process product data here
$buffer = '';
} else {
$buffer .= "\n";
}
}
fclose($handle);
}