读入一个文本文件,按一个不正常的字符进行拆分并处理" line"按行

时间:2015-10-21 19:38:06

标签: php mysql csv

我可以轻松使用格式清晰的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);
}

我不确定如何最好地解释这个问题。如果我能提供更多信息,请告诉我。

2 个答案:

答案 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);
}