首页 > 解决方案 > 有没有更有效的编码方式(没有 mysql )

问题描述

我想从包含 20,000 到 30,000 行的文本文件中提取几百行。将这些行写入较小的(提取的)文件后,我想从较大的(源)文件中删除/删除这些行。我拼凑了一些 php 代码来完成我的开发文件的工作,但在处理较大的文件时似乎效率很低。

这是我放在一起的:

<?php 
// WRITE SPECIFIED NUMBER OF LINES OF TEXT FROM SOURCE FILE TO EXTRACTED FILE

$file = fopen("extracted.txt", "w+");
flock($file, 2);

$file2read = fopen("source.txt","r+");
for ($i = 0; $i <= 9; $i++) {
    $keyphrase = fgets($file2read) ;
    fputs ($file, $keyphrase);
}

//     SOURCE LINES HAVE BEEN WRITTEN TO EXTRACTED FILE

fclose($file2read);
flock($file, 3);
fclose($file);

// NOW PROCESS SOURCE FILE TO STRIP OUT EXTRACTED FILES AND COMPACT SOURCE FILE FOR NEXT EXTRACT

for ($i = 0; $i <= 9; $i++) {
    $file2read = fopen("source.txt","r+");
    $keyphrase = fgets($file2read) ;

    $rows = file("source.txt");    

    foreach($rows as $key => $row) {
        if(preg_match("/($keyphrase)/", $row)) {
            unset($rows[$key]);
        }
    }

    file_put_contents("temporary1.txt", implode("\n", $rows));

    // STRIP OUT EMPTY LINES WHILE COPYING FROM MODIFIED SOURCE IMAGE (TEMPORARY1.TXT) TO TEMPORARY FILE

    file_put_contents('temporary.txt',
        preg_replace(
            '/\R+/',
            "\n",
            file_get_contents('temporary1.txt')
        )
    );

    // COPY TEMPORARY FILE TO PRODUCE UPDATED SOURCE FILE WITH EXTRACTED LINES REMOVED
    copy("temporary.txt","source.txt");

}  // CLOSE INITIAL 'FOR LOOP'

unlink ("temporary1.txt");  // CLEAR DISKSPACE OF TEMPORARY FILE 
unlink ("temporary.txt");  // CLEAR DISKSPACE OF TEMPORARY FILE

在第一个代码块中将这些行复制到提取的文件中似乎很简单。但是删除这些行并压缩源文件看起来很丑陋并且消耗了多个循环。有没有更好的方法,不使用 mysql 数据库?

标签: phptext-parsing

解决方案


扩展我的评论:使这个程序将输入中的行过滤到两个临时文件中,然后将临时文件移回原处。

我无法完全掌握一行是否被接受或拒绝的逻辑,所以这里用一个愚蠢的检查来代替它,检查该行是否以小写元音开头。

(另外,我写 PHP 已经有一段时间了,它可能有问题。)

<?php

$input = fopen("source.txt", "r");
$output_1 = fopen("temp1.txt", "w");
$output_2 = fopen("temp2.txt", "w");

while (($line = fgets($handle)) !== false) {
    $accepted = preg_match("/^[aeiou]/", $line); // TODO: replace this logic
    fwrite(($accepted ? $output_1 : $output_2), $line . "\n");
}
fclose($output_1);
fclose($output_2);

rename("temp1.txt", "extracted.txt");
rename("temp2.txt", "source.txt");

推荐阅读