получить содержимое файла с определением пользователя в php? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть файл dict.txt с его содержимым

a
aah
aahed
aahing
aahs
b
baa
baaed
baaing
baal
baalism
baalisms
baals
baas
baba
babas
babbitting
babble
babbled
babbler

Как мне прочитать этот файл, начиная с a или только с другого.Я знаю, что функция file_get_contents будет получать строковое содержимое в файле,

function getStartWith($letter){
    $allListStartWithWord = array();
    $source = __SITE_PATH."/tmp/wordsEn.txt";
    $content = file_get_contents($source );
    $all_list = explode('\n', $content ); // it is big one 
    fclose($fh);
   return $allListStartWithWord;    

}

любой мог бы подсказать мне, как это сделать с большим файлом, например All All Word.

Ответы [ 4 ]

2 голосов
/ 08 ноября 2011
$fp = fopen(__SITE_PATH."/tmp/wordsEn.txt", 'rb');
while (!feof($fp)) {
  $line = fgets($fp);
}
fclose($fp);

Считывает файл построчно

1 голос
/ 08 ноября 2011

Вам необходимо:

a.читать файл построчно, пока не найдете символ

$foundO = false;
while($s=fgets($fh)){
  if(!$foundO && $s[0]!='o') continue; // before O
  if($foundO && $s[0]!='o') break; // after O
  // good line
}

или

b.создайте индексный файл, содержащий позиции для начальных символов, и используйте fseek

$index = file('index.txt');
$pos = $index[ord('O'-65); // 65 is ord('A');
fseek($fh, $pos);
1 голос
/ 08 ноября 2011

Вы не можете читать строку и тестировать, если она начинается с a, я вижу два решения, чтобы немного ускорить процесс:

  • Если вы знаете, чтослова отсортированы, вы можете остановиться, когда найдете строку, начинающуюся с b
  • . Напишите скрипт, который разбит ваш файл на буквенные файлы dict-a, dict-b ... таким образом, вы 'Вам останется только прочитать dict- $ letter.
0 голосов
/ 24 ноября 2012

Взгляните на SplFileObject, который поддерживает построчное чтение файла с простым foreach:

$file = new SplFileObject($path);
foreach ($file as $line)
{
     ...
}

Поскольку он предлагает итерацию по всем строкам, вы также можете отфильтровать его напрямую, например, получить все строки, начинающиеся с a и удаляя разрывы строк:

$file = new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);

Теперь, вы хотите отфильтровать строки, вы можете просто добавить фильтр:

$linesStartingWithA = new RegexIterator($file, '/^a/');

Если вы теперь используете foreach для новой переменной, вы получите все строки, начинающиеся с a:

foreach ($linesStartingWithA as $line)
{
     ...
}

Простой пример с объектом SplTempFileObject для демонстрации этого (здесь временный файл, потому что тогда ему не нужен физический файл на диске, это особый тип SplFileObject). 1024 *

Пример ( Демо ):

// for the example, a SplFileObject of SplTempFileObject is used.
$file = new SplTempFileObject();
$file->setFlags(SplFileObject::DROP_NEW_LINE);
$file->fwrite('a
aah
aahed
aahing
aahs
b
baa
baaed
baaing
baal
baalism
baalisms
baals
baas
baba
babas
babbitting
babble
babbled
babbler');

$linesStartingWithA = new RegexIterator($file, '/^a/');

foreach ($linesStartingWithA as $line => $string)
{
    printf("#%d: %s\n", $line, $string);
}

Выход:

#0: a
#1: aah
#2: aahed
#3: aahing
#4: aahs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...