Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Разбор текстового файла в массив переменных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
billybons2006
Отправлено: 15 Июля, 2013 - 13:55:17
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Есть текстовый файл с подобным содержимым:

1 Тема1

Текст ываы ваываываы
ываы
ыаыаываы ываыаыа ыа
ы34 кываыв

2 Тема ываыва ыв ыва 2

Текст ываы ваываываы ываы ыаыаываы ываыаыа ыа
ы34 кываыв. РОпвап оыва...

Я хочу считать файл чтобы записать в базу данных.

Если построчно считывать, то как-то так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $file = fopen('q.txt');
  3.  
  4. while(!feof($file)){
  5. $str = trim(fgets($file));
  6. if(empty($str)) continue;
  7.  
  8. if(preg_match('/^([0-9\.]+)(\*)?\s(.+)$/', $str, $matches)){
  9.  
  10. $matches[1];//номер вопроса/ответа
  11. $matches[2];//если = *, ответ верный
  12. $matches[3];//вопрос/ответ
  13.  
  14. }
  15.  
  16. }
  17. fclose('q.txt');
  18.  


Вопрос в том, что содержимое текста не в той же строке, что и номер и тема. Т.е. мне считывать файл построчно, пока не встречу новую строку формата "цифра текст". Я ужасно не хочу изобретать велосипед... Я их нагородил уже столько... Знаете какое-нибудь стандартное решение?

(Добавление)
Под велосипедом я подразумеваю нечто такое:

PHP:
скопировать код в буфер обмена
  1.  
  2. // массив с результатами
  3. $num[]= "";
  4. $head[]= "";
  5. $body[]= "";
  6.  
  7. $i = 0; // индекс
  8.  
  9. $file = fopen('q.txt');
  10.  
  11. while(!feof($file)){
  12.         $str = trim(fgets($file));
  13.        
  14.         if(empty($str)) continue;
  15.  
  16.         if(preg_match('/^([0-9\.]+)\t(.+)$/', $str, $matches)){
  17.                 $i=$i+1;
  18.                 $num[$i]=$matches[1];//номер записи
  19.                 $head[$i]=$matches[2];//заголовок записи               
  20.         } else $body[$i] .= $str;
  21.        
  22. }
  23. fclose('q.txt');
  24.  

(Отредактировано автором: 15 Июля, 2013 - 14:28:22)

 
 Top
LIME
Отправлено: 15 Июля, 2013 - 14:55:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PHP:
скопировать код в буфер обмена
  1. $array = preg_split('#^\d+ #s', file_get_contents($fileName));// разбивает по признаку "цифра в начале строки и пробел"

(Отредактировано автором: 15 Июля, 2013 - 14:55:37)

 
 Top
billybons2006
Отправлено: 15 Июля, 2013 - 15:06:37
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




А не так (перед s поставил '\'):
 
 Top
VenZell
Отправлено: 15 Июля, 2013 - 15:10:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




billybons2006, нет, насколько я понимаю, LIME включает режим соответствия точки символам переноса строки и возврата каретки. Вопрос только зачем?
 
 Top
billybons2006
Отправлено: 15 Июля, 2013 - 15:19:57
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Если я правильно понимаю, эта штука должна считать строку вида
"<число><пробел><текст>"
в качестве разделителя. Так?
 
 Top
LIME
Отправлено: 15 Июля, 2013 - 15:26:13
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




в противном случае регулярка будет рассматривать каждую строку отдельно
(Добавление)
billybons2006 не так но почти
(Добавление)
я же комент написал ...зачем я только это сделал?
 
 Top
billybons2006
Отправлено: 15 Июля, 2013 - 15:27:26
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Я сильно рискую, но что ж темнить, редко встречаюсь с регулярками ((

# - начало строки.
\d+ - целое число
- пробел
# - конец строки
s - ???
(Добавление)
LIME, я благодарен за ответ и коммент! Коммент я видел, поэтому и не понял, почему разделитель именно "цифра и пробел", когда после пробела еще и заголовок идет, а собств. текст с новой строки.
 
 Top
LIME
Отправлено: 15 Июля, 2013 - 15:37:56
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ыгым
тогда такой шаблон
PHP:
скопировать код в буфер обмена
  1. $array = preg_split('#' . PHP_EOL . '|^\d+ .+' . PHP_EOL . '#sU', file_get_contents($fileName));
вроде всё учли?
еще надо глянуть флаги ф-ции...как понимаю неплохо бы еще и данные из заголовка вытянуть?
(Добавление)
# - ограничители шаблона...все что после них это модификаторы
^ - начало текста...тут встретится только в самом начале файла...потом сыграют символы новой строки
пробел указан только 1...если надо более то укажи квантификатор + после него(1 или более повторений)

(Отредактировано автором: 15 Июля, 2013 - 15:46:12)

 
 Top
billybons2006
Отправлено: 15 Июля, 2013 - 15:59:55
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Спасибо за участие, дальше я сам. Не могу кликнуть спасибо-кнопку, примите устно )

(Отредактировано автором: 15 Июля, 2013 - 16:31:40)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB