删除类似的行 - PHP

时间:2011-09-17 02:55:11

标签: php

是否可以删除行中前30个字符相同的所有行,然后只删除包含这些字符的第一行?

示例:

xx2 Lorem ipsum dolor sit amet, fdsfdsfs
xx2 Lorem ipsum dolor sit amet, 43434343

第二个应该删除...希望有可能......谢谢

2 个答案:

答案 0 :(得分:3)

$page = explode( "\n", $file );
$count = 0;
foreach( $page as $line )
{
  if( in_array( substr( $line, 0, 30 ), $search ) ){
    unset( $page[$count] );  // delete the duplicate..
  }else{
    $search[] = substr( $line, 0, 30 );
  }
  $count++;
}

基本上它需要一个文件或多行字符串并逐行循环遍历文件。如果遇到前30个字符,则删除该行。如果没有,则将其添加到要检查的列表中。当循环遍历文件时,将只有每个唯一开始字符串的一个实例。 试一试,祝你好运。

答案 1 :(得分:2)

如果您需要处理非常大的文件,一次只读一行并写入临时文件将消耗更少的内存。使用临时文件并在完成后将其重命名为输入文件将以原子方式执行操作而不会丢失原始文件。检查数组键而不是值将提供快速查找,因为键被索引。您还需要处理false上返回substr的空白行的边缘大小写。

<?php
$infile_name = "infile.txt";

$seen = array();
$infile = fopen($infile_name, "r");
if ( $infile !== false ) {
    // Temporary file to write results to
    $outfile_name = tempnam(sys_get_temp_dir(), 'tmp');
    $outfile = fopen($outfile_name, "w");

    while (!feof($infile)) {
        $line = fgets($infile);
        if ( $line == '' ) {
            // blank line, just write it
            fwrite($outfile, $line);
        }
        else {
            $prefix = substr( $line, 0, 30 );

            if ( !array_key_exists($prefix, $seen) ) {
               fwrite($outfile, $line);

               // Store the prefix as a key for fast indexed lookup
               $seen[$prefix] = true;
            }
        }
    }

    fclose($infile);
    fclose($outfile);

    // Remove the old file and put the new file in its place
    unlink($infile_name);
    rename($outfile_name, $infile_name);
}
?>