PHP - Как мне открыть файлы и прочитать их, а затем написать новые с "х" строк на файл? - PullRequest
2 голосов
/ 11 сентября 2010

Я уже писал этот вопрос здесь, но ответов не было. Возможно, я сделал что-то не так, так что здесь снова с некоторыми подробностями.

Файлы в каталоге называются 1.txt, 2.txt, 3.txt и т. Д. .... Фрагмент ниже входит в этот каталог, открывает все *, txt файлы, читая их, удаляет дубликаты и создает один файл со всем уникальным содержанием. (имена в данном случае).

$files = glob($dirname."/*.txt"); //matches all text files
    $lines = array();
    foreach($files as $file)
    {
    $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
    }
    $lines = array_unique($lines);
    file_put_contents($dirname."/allofthem.txt", implode("\n", $lines));
    }

Вышеописанное прекрасно работает для меня! Благодаря большой помощи здесь в stackoverflow.

Но я хочу сделать еще один шаг вперед.

Вместо одного большого дубликата свободного файла "allofthem.txt", как я могу изменить приведенный выше код для создания файлов с максимум 5оо ​​строк каждый из новых данных?

Им нужно перейти в новый каталог, например, $ dirname. "/ Done /".$ i.". Txt "Я попытался подсчитать в цикле, но мои усилия не работают и в итоге достигли мили.

Я также попытался вставить 500 в массив, увеличить его до другого массива и сохранить таким образом. Неудачно. Я просто не "получаю" это.

Опять же, этому новичку нужна помощь специалиста. Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 11 сентября 2010

Когда у вас есть массив строк в соответствии с вашим кодом, вы можете разбить его на куски по 500 строк, используя array_chunk, а затем записать каждый кусок в свой собственный файл:

// ... from your code
$lines = array_unique($lines);

$counter = 1;
foreach (array_chunk($lines, 500) as $chunk)
{
  file_put_contents($dirname . "/done/" . $counter . ".txt", implode("\n", $chunk));
  $counter++;
}
1 голос
/ 11 сентября 2010

эта функция вас куда-то доставит!

function files_identical($fn1, $fn2) {
    if(filetype($fn1) !== filetype($fn2))
        return FALSE;

    if(filesize($fn1) !== filesize($fn2))
        return FALSE;

    if(!$fp1 = fopen($fn1, 'rb'))
        return FALSE;

    if(!$fp2 = fopen($fn2, 'rb')) {
        fclose($fp1);
        return FALSE;
    }

    $same = TRUE;
    while (!feof($fp1) and !feof($fp2))
        if(fread($fp1, 4096) !== fread($fp2, 4096)) {
            $same = FALSE;
            break;
        }

    if(feof($fp1) !== feof($fp2))
        $same = FALSE;

    fclose($fp1);
    fclose($fp2);

    return $same;
}

Src: http://www.php.net/manual/en/function.md5-file.php#94494

0 голосов
/ 11 сентября 2010
$files = glob($dirname."/*.txt"); //matches all text files
$lines = array();
foreach($files as $file)
{
   $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
}
$lines = array_unique($lines);
$lines_per_file = 500;
$files = count($lines)/$lines_per_file;
if(count($lines) % $lines_per_file > 0) $files++;
for($i = 0; $i < $files; $i++) {
    $write = array_slice($lines, $lines_per_file * $i, $lines_per_file);
    file_put_contents($dirname."/done/".$i.".txt", implode("\n", $write));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...