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]   

> Описание: Есть текстовый файл. нужно его покромсать на куски.
13n1n
Отправлено: 25 Июля, 2010 - 20:10:04
Post Id


Новичок


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


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




Здравствуйте, Отцы ПХП )
Задача такая:
Есть текстовый файл "q.txt" - в нем есть много много текста.
Текст собой представляет вопросы с вариантами ответа.
Вида такого:
================================ ==
2. ыа ыпыв ыв ы
3. ывсыс
4. ымымы


5.9 Текст вопроса на который внизу написаны разлные ответы, из них один правильный.
1. Ответ не правильный.
2. Не правильный ответ.
3.* Правильный ответ.
4. Совсем даже не ответ
5. Почти правильный ответ, но немножко с заковырочкой.
6. Вообще бред не по теме.


5.73 Еще один текст вопроса
1. Ответ не правильный.
2.* Правильный ответ.
3. Не правильный ответ.

================================ ===
Т.е вот такой файл с 500 вопросами к примеру.
мне нужно выдернуть и распихать по переменным, а лучше в sql вот какие вещи:
1. Номер раздела вопроса (цифра 5)
2. Номер вопроса (9, 73)
3. Правильынй ответ в определенную переменную (в тексте она будет отображаться "*")
4. остальные ответы в остальные переменные. Порядок ответов не пренципиален.



Накидайте кто умеет хотя бы небольшой скриптик который просто по переменным это все сумеет читать.
а с переменных я уже сам смогу в sql записать.

кто сделает на телефон стольник закину ) Закатив глазки
 
 Top
Uchkuma
Отправлено: 25 Июля, 2010 - 20:54:18
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


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




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

(Добавление)
Если сами не справитесь, покажу, как можно определить вопрос или ответ.
 
 Top
13n1n
Отправлено: 25 Июля, 2010 - 21:25:11
Post Id


Новичок


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


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




выдает ошибки: Растерялся
Warning: fopen() expects at least 2 parameters, 1 given in Z:\home\test\www\index.php on line 2

Warning: feof(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 4

Warning: fgets(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 6

Warning: feof(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 4

Warning: fgets(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 6

Warning: feof(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 4

Warning: fgets(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 6

Warning: feof(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 4

Warning: fgets(): supplied argument is not a valid stream resource in Z:\home\test\www\index.php on line 6
 
 Top
Uchkuma
Отправлено: 25 Июля, 2010 - 21:59:52
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


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




 
 Top
13n1n
Отправлено: 25 Июля, 2010 - 22:10:32
Post Id


Новичок


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


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






так. ну сейчас ошибок не выводит...

расскажите теперь как им пользоваться.

у меня файл и в нем 500 вопросов.
как мне сделать так, чтобы с каждого блока текста "1 вопрос - 6 ответов" у меня были:
1. Номер раздела.
2. Номер вопроса.
3. Текст вопроса
4. Текст правильного ответа
5. Текст не правильного ответа 2
6. Текст не правильного ответа 3
7. Текст не правильного ответа 4
8. Текст не правильного ответа 5
9. Текст не правильного ответа 6


Радость



(Добавление)


кстати количество ответов не всегда 6.
оно меняется и может быть от 3 до 6.
Это не на что не влияет? ) Хм

(Отредактировано автором: 25 Июля, 2010 - 22:14:40)

 
 Top
Uchkuma
Отправлено: 26 Июля, 2010 - 08:37:38
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


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




Не влияет. Щас необходимо понять, как будем определять, что строка является вопросом, а не ответом. У вопроса всегда двойной номер через точку?
 
 Top
13n1n
Отправлено: 26 Июля, 2010 - 10:38:50
Post Id


Новичок


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


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




Не конечно ) не всегда )
номер вопроса идет с первого по последний )
вопросов в разделе бывает 40, 60, 80, 120.


Может быть реализовать механизм такой:
1. открыть файл как поток.
2. записывать все в первую ячейку массива до тех пор пока не встретится пустая строка (вопросы разделяются пустой строкой - как в примере выше)
3. со следующей не пустой строки записывать все во вторую ячейку массива.
Т.е. этим циклом создадим массив - в каждой ячейке массива будет вопрос + ответы
4. Берем первую ячейку массива (т.е. первый вопрос) и режем это все на элементы Улыбка
- из первой строки дергаем раздел, номер вопроса, название вопроса
- вторую строку (с третьего символа) записываем в первый ответ
- третью строку (с третьего символа) записываем во второй ответ
- и т.д.
- шестую строку в шестой ответ
5. ну и где-то тут в 4 пункте впихнуть проверочку на вишенку - "*" чтобы она записывалась в конкретную переменную.
Ну или просто из всех вариантов ответов проанализировать какой из них правильынй и переприсвоить ей другую переменную
==========

я просто давно пхп не занимался. уже забыл всё.
сейчас просто нужно большой объем вопросов перефасовать в sql таблицу.
в ручную долго. я 10 вопросов 10 минут загонял через phpmyadmin )
а вопросов будет очень много - пара тыщ )


Или хотя бы пусть с небольшими недочетами фасует. напрмиер без номера вопроса.
это вручную можно уже в таблице подправить.
хочется минимизировать ручную работу.

(Отредактировано автором: 26 Июля, 2010 - 10:40:40)

 
 Top
isle
Отправлено: 26 Июля, 2010 - 12:21:44
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




13n1n пишет:
Может быть реализовать механизм такой


Почти правильно. Обычным файл_гкт_контент можно всё вытащить без проблем, далее сохранить всё в многомерный массив (обратно в текстовый файл, можно с разбивкой, если памяти не очень много), а его уже перекинуть в БД. Много раз такое делал - пустяковая вещь, только единственно в справочники постоянно лезу, если нужно с массивами работать - тягомутно для меня.

Для начала нужно вытащить каждый блок (вопрос-ответы) через preg_match_all, а потом все блоки разбить на подмассивы. В общем-то ничего сверхъестественного, но нужны конкретные метки на которые можно ориентироваться: например, все вопросы должны строго на конце иметь символ "?", либо иметь вначале "\n\n", чтобы выделить цельный блок, а дальше дело техники.

13n1n пишет:
хочется минимизировать ручную работу.


Можно автоматизировать абсолютно всё, не пойму только как разделить... Судя по всему, это строго идет:

"5.9 Текст вопроса ..."

Если да, то можно блоки разбить по шаблону "цифра-точка-цифра". Нужно от вас уточнение.
 
 Top
Саныч Модератор
Отправлено: 26 Июля, 2010 - 12:54:47
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




isle пишет:
Нужно от вас уточнение.

а еще лучше кусочек txt файла с вопросами, чтобы было все наглядно понятно


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
13n1n
Отправлено: 26 Июля, 2010 - 13:37:34
Post Id


Новичок


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


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




Я прикрепил образец вопросов.
1. q1.doc
Кусок файла .doc - в таком виде изначально находятся все вопросы. Правильный выделен жирным текстом.
2. q2.txt
К такому виду, в принципе, можно привести для более удобной работы с php. ручками проставить вишенку "*" Радость и потом уже хреначить скриптом )

Для меня тоже массивы являются довольно тягомутной вещью. ) по этмоу и обращаюсь за помощь. так как вчерашние сутки корпения над различными примерами и скриптами не увенчались скорым успехом Закатив глазки
Скачать файл: QQ.rar
Скачан раз: 124

(Отредактировано автором: 26 Июля, 2010 - 13:38:33)

 
 Top
isle
Отправлено: 26 Июля, 2010 - 14:29:06
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




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

Без "опережения" скрипт будет кидать в массив вместо 6 ответов только 5, но 6-й найти не сложно, раз есть уже 5, то из исходного блока достаточно удалить вопрос и 5 имеющихся ответов, таким образом исключениями получим и 6-й... Может кто сейчас подправит регулярку, ну, или сами по указанному алгоритму, раз с php знакомыУлыбка А у меня времени нет копать всё это, своими сайтами занимаюсь. Надеюсь, помог.

Если это точная копия, то регулярка будет такой:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = 'txt.txt';
  2. $data = file_get_contents($file);
  3. preg_match_all('|(\s+\d+\.\d+\s+.*?)\s+\d+\.\d+\s+|smi',$data,$out);
  4. $c = count($out[1]);
  5. #for($i=0;$i<$c;$i++) echo $out[1][$i];
  6.  
  7. ...
  8.  
  9. for($i=0;$i<$c;$i++) {
  10.  preg_match('|(\s+\d+\.\d+\s+.*?)\s+\d+\.\s+|smi',$out[1][$i],$q);
  11.  $question = $q?$q:false;
  12.  if ($question) {
  13.         $my[$i]['question'] = $question;
  14.         preg_match_all('|(\s+\d+\.\s+.*?)\s+\d+\.\s+|smi',$out[1][$i],$a);
  15.         $answers = $a[1];
  16.         foreach($answers as $ans) {
  17.           $j = 0;
  18.           if (preg_match('|\d+\.\*\s+|smi',$ans)) $my[$i]['answer_good'][$j] = $ans;
  19.           else $my[$i]['answer'][$j] = $ans;
  20.           $j++;
  21.         }
  22.  }
  23. }
  24. #echo '<br /><pre>'; print_r($my); echo '</pre>';


Ну всё, вроде ничего не упустил. На выходе получим каждый ответ отдельно, включая правильный (он тоже отдельно) за каждым вопросом (вопросы тоже разбиты), ну а далее заносите массив в БД или сохраняйте на винчестер и обрабатывайте как вам надо ;)
(Добавление)
Что-то сразу не вдумался Ха-ха

Если все вопросы изначально в Ворде, то никчему ничего приводить не нужно - надо просто сохранить как XML или как Excel-файл, тогда скрипт вообще в несколько строк выйдет Радость и импортировать в БД можно сразу без регулярок и обраток различных.

(Отредактировано автором: 26 Июля, 2010 - 14:34:08)

 
 Top
13n1n
Отправлено: 29 Июля, 2010 - 08:20:41
Post Id


Новичок


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


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




да, спасибо за код )
Но единственное верное решение которое я вынес из всего нашего обсуждения - это перевести файл в эксель из него сделать csv и загрузить это в mysql )
спасибо, isle, за эту идею )
но руками все равно много делать ) Хм
 
 Top
JustUserR
Отправлено: 30 Июля, 2010 - 14:30:51
Post Id



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


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


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




Uchkuma пишет:
Щас необходимо понять, как будем определять, что строка является вопросом, а не ответом. У вопроса всегда двойной номер через точку?
Вообще при работе с текстовой базой данных почти всегда необходимо добавлять шифрование или экранирование исходный данных - в таком случае можно просто задать формат разделителя для вопросов и ответов и всегда однозначно выполнять обратное извлечение В данном случае достаточно иметь два разделителя - один их них будет определять разбиение вопросов а второй самих вариантов ответа - причем номера разделов и вопросов можно не разделять поскольку они однозначно извлекаются по позиции в строке Если автор хочет иметь текстовую БД с наглядным отображением и редактированем то можно выбрать такой формат - вопрос и варианты ответа отделяются символом новой строки а несколько вопросов между собой двумя таким символами - в таком случае придется экранировать слеш и символы \n для того чтобы вопрос мог сам включить символ переноса строки


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB