#php #file
#php #файл
Вопрос:
У меня есть файл 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 English Word.
Ответ №1:
$fp = fopen(__SITE_PATH."/tmp/wordsEn.txt", 'rb');
while (!feof($fp)) {
$line = fgets($fp);
}
fclose($fp);
Читает файл построчно
Ответ №2:
Вы не можете читать строку и проверять, начинается ли она с a
, я вижу два решения, которые немного ускорят процесс:
- Если вы знаете, что слова отсортированы, вы можете остановиться, когда найдете строку, начинающуюся с
b
- Напишите скрипт для разделения вашего файла на файлы с конкретными буквами dict-a, dict-b… таким образом, вам нужно будет только прочитать dict-$letter.
Ответ №3:
Вам нужно:
a. прочитайте файл построчно, пока не найдете символ
$foundO = false;
while($s=fgets($fh)){
if(!$foundO amp;amp; $s[0]!='o') continue; // before O
if($foundO amp;amp; $s[0]!='o') break; // after O
// good line
}
или
б. создайте индексный файл, содержащий позиции для начальных символов, и используйте fseek
$index = file('index.txt');
$pos = $index[ord('O'-65); // 65 is ord('A');
fseek($fh, $pos);
Ответ №4:
Взгляните на 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
).
Пример (демо):
// 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: %sn", $line, $string);
}
Вывод:
#0: a
#1: aah
#2: aahed
#3: aahing
#4: aahs