Получение всех строк из файла и добавление уникальных строк в новый файл - PullRequest
0 голосов
/ 06 сентября 2010

Используя PHP, я целый день пытался это сделать.Я провалил.Я хочу:

  1. открыть каталог и прочитать все файлы в нем.
  2. читать содержимое каждого файла построчно (каждая строка - это имя без пробелов (один столбец)).
  3. поместите каждую строку в новый файл (перевод новой строки).
  4. удалите повторяющиеся строки.
  5. сохраните новый файл.

Easyдля гуру, помните о нем.

ПРИМЕЧАНИЕ. Каждый файл может иметь длину 500 строк и 20 символов в строке, но файлов всего около 20.

Заранее спасибо за помощь.

Еще раз спасибо.Основываясь на сообщениях ниже, я попробовал

    $topdir = '/home/mycal25/public_html/processed/';


$files = glob($topdir."*.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($topdir."all/all.txt", implode("\n", $lines));

Но это не сработало ... Я попробовал пару других вариантов безрезультатно.

Ответы [ 4 ]

4 голосов
/ 06 сентября 2010

Что-то вроде:

$lines = array()
foreach ($files as $file) {
    $lines = array_merge($lines, file($file));
}

$lines = array_unique($lines);

$fp = fopen('dest.txt', 'w');
foreach ($lines as $line) {
    fwrite($fp, $line);
}
fclose($fp);

В качестве альтернативы вы можете сделать это по-другому, когда вы проверяете уникальные записи при каждой загрузке нового файла.Это сэкономило бы ОЗУ, но потенциально использовало бы больше ЦП.

На основе вашего комментария о opendir вы можете сделать что-то вроде следующего:

$files = glob('/home/mycal25/public_html/processed/*');

или придерживаться opendir()

$topdir = '/home/mycal25/public_html/processed';
$dh = opendir($topdir);
while (($file = readdir($dh)) !== false) {
    $lines = array_merge($lines, file($topdir . '/' . $file));
}

Я пропустил некоторые проверки жизненно важных ошибок, просто чтобы сделать код короче и проще для чтения.Но если вы хотите быть уверены, всегда проверяйте возвращаемые значения из opendir / glob / fopen и т. Д.

0 голосов
/ 06 сентября 2010
<?php

$lines = array();

foreach($files as $file)
{
    $lines = array_merge($lines, array_fill_keys(file($file, FILE_SKIP_EMPTY_LINES), 1));
}

file_put_contents('file.txt', implode(array_keys($lines)));

?>
0 голосов
/ 06 сентября 2010

8 часов не зря; думайте так, и вы определенно будете ненавидеть программирование! Я вижу очень хорошее решение проблемы, в которой может быть несколько ошибок, но все мысли и большие штрихи есть. Возможно, вам просто понадобятся некоторые улучшения в ваших методах отладки.

Вот что я бы сделал: вместо встроенных вызовов функций запишите их как свои собственные операторы и сохраните возвращаемые значения в значимые переменные. Проверьте это:

$topDir = '/home/mycal25/public_html/processed/';

/* Grab names of all needed text files */
$filePaths = glob($topdir . '*.txt');

$names = array();

foreach($filePaths as $filePath) {
    $fileLines = file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
    $names = array_merge($names, $fileLines);
}

$uniqueNames = array_unique($names);

$nameList = implode("\n", $uniqueNames);

file_put_contents($topDir . 'all/all.txt', $nameList);

Это был бы мой личный стиль. Теперь вы можете сделать var_dump () для каждой переменной и запустить свой скрипт. Делая это, вы в конечном итоге по выходным данным узнаете, какая переменная не содержит того, что вы хотели, чтобы она содержала.

Также убедитесь, что все отчеты об ошибках включены. Бесстыдное подключение: http://www.needtodevelop.com/error-reporting-in-php

0 голосов
/ 06 сентября 2010

Просто отметим, что использование sort -u в системах на основе Unix может помочь вам очень легко, если порядок сортировки нового файла не имеет значения.

Если вы используете PHP на хосте, который основан на Unix, вы, скорее всего, можете использовать sort - system () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...