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 :: Чтение из файла. разбиение на куски и запись в переменные
Покинул форум
Сообщений всего: 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 записать.
кто сделает на телефон стольник закину )
Uchkuma
Отправлено: 25 Июля, 2010 - 20:54:18
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
у меня файл и в нем 500 вопросов.
как мне сделать так, чтобы с каждого блока текста "1 вопрос - 6 ответов" у меня были:
1. Номер раздела.
2. Номер вопроса.
3. Текст вопроса
4. Текст правильного ответа
5. Текст не правильного ответа 2
6. Текст не правильного ответа 3
7. Текст не правильного ответа 4
8. Текст не правильного ответа 5
9. Текст не правильного ответа 6
(Добавление)
кстати количество ответов не всегда 6.
оно меняется и может быть от 3 до 6.
Это не на что не влияет? )
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
Не влияет. Щас необходимо понять, как будем определять, что строка является вопросом, а не ответом. У вопроса всегда двойной номер через точку?
13n1n
Отправлено: 26 Июля, 2010 - 10:38:50
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Не конечно ) не всегда )
номер вопроса идет с первого по последний )
вопросов в разделе бывает 40, 60, 80, 120.
Может быть реализовать механизм такой:
1. открыть файл как поток.
2. записывать все в первую ячейку массива до тех пор пока не встретится пустая строка (вопросы разделяются пустой строкой - как в примере выше)
3. со следующей не пустой строки записывать все во вторую ячейку массива.
Т.е. этим циклом создадим массив - в каждой ячейке массива будет вопрос + ответы
4. Берем первую ячейку массива (т.е. первый вопрос) и режем это все на элементы
- из первой строки дергаем раздел, номер вопроса, название вопроса
- вторую строку (с третьего символа) записываем в первый ответ
- третью строку (с третьего символа) записываем во второй ответ
- и т.д.
- шестую строку в шестой ответ
5. ну и где-то тут в 4 пункте впихнуть проверочку на вишенку - "*" чтобы она записывалась в конкретную переменную.
Ну или просто из всех вариантов ответов проанализировать какой из них правильынй и переприсвоить ей другую переменную
==========
я просто давно пхп не занимался. уже забыл всё.
сейчас просто нужно большой объем вопросов перефасовать в sql таблицу.
в ручную долго. я 10 вопросов 10 минут загонял через phpmyadmin )
а вопросов будет очень много - пара тыщ )
Или хотя бы пусть с небольшими недочетами фасует. напрмиер без номера вопроса.
это вручную можно уже в таблице подправить.
хочется минимизировать ручную работу.
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
13n1n пишет:
Может быть реализовать механизм такой
Почти правильно. Обычным файл_гкт_контент можно всё вытащить без проблем, далее сохранить всё в многомерный массив (обратно в текстовый файл, можно с разбивкой, если памяти не очень много), а его уже перекинуть в БД. Много раз такое делал - пустяковая вещь, только единственно в справочники постоянно лезу, если нужно с массивами работать - тягомутно для меня.
Для начала нужно вытащить каждый блок (вопрос-ответы) через preg_match_all, а потом все блоки разбить на подмассивы. В общем-то ничего сверхъестественного, но нужны конкретные метки на которые можно ориентироваться: например, все вопросы должны строго на конце иметь символ "?", либо иметь вначале "\n\n", чтобы выделить цельный блок, а дальше дело техники.
13n1n пишет:
хочется минимизировать ручную работу.
Можно автоматизировать абсолютно всё, не пойму только как разделить... Судя по всему, это строго идет:
"5.9 Текст вопроса ..."
Если да, то можно блоки разбить по шаблону "цифра-точка-цифра". Нужно от вас уточнение.
Саныч
Отправлено: 26 Июля, 2010 - 12:54:47
Участник
Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010 Откуда: Украина, Запорожье
Помог: 62 раз(а)
isle пишет:
Нужно от вас уточнение.
а еще лучше кусочек txt файла с вопросами, чтобы было все наглядно понятно
----- Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
13n1n
Отправлено: 26 Июля, 2010 - 13:37:34
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
Я прикрепил образец вопросов.
1. q1.doc
Кусок файла .doc - в таком виде изначально находятся все вопросы. Правильный выделен жирным текстом.
2. q2.txt
К такому виду, в принципе, можно привести для более удобной работы с php. ручками проставить вишенку "*" и потом уже хреначить скриптом )
Для меня тоже массивы являются довольно тягомутной вещью. ) по этмоу и обращаюсь за помощь. так как вчерашние сутки корпения над различными примерами и скриптами не увенчались скорым успехом
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
К сожалению, подзабыл как делается "опережение" в регулярках, поэтому наваял простенький скриптик на скорую руку, должен работать, но не проверял.
Без "опережения" скрипт будет кидать в массив вместо 6 ответов только 5, но 6-й найти не сложно, раз есть уже 5, то из исходного блока достаточно удалить вопрос и 5 имеющихся ответов, таким образом исключениями получим и 6-й... Может кто сейчас подправит регулярку, ну, или сами по указанному алгоритму, раз с php знакомы А у меня времени нет копать всё это, своими сайтами занимаюсь. Надеюсь, помог.
Ну всё, вроде ничего не упустил. На выходе получим каждый ответ отдельно, включая правильный (он тоже отдельно) за каждым вопросом (вопросы тоже разбиты), ну а далее заносите массив в БД или сохраняйте на винчестер и обрабатывайте как вам надо ;) (Добавление)
Что-то сразу не вдумался
Если все вопросы изначально в Ворде, то никчему ничего приводить не нужно - надо просто сохранить как XML или как Excel-файл, тогда скрипт вообще в несколько строк выйдет и импортировать в БД можно сразу без регулярок и обраток различных.
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2010
Помог: 0 раз(а)
да, спасибо за код )
Но единственное верное решение которое я вынес из всего нашего обсуждения - это перевести файл в эксель из него сделать csv и загрузить это в mysql )
спасибо, isle, за эту идею )
но руками все равно много делать )
JustUserR
Отправлено: 30 Июля, 2010 - 14:30:51
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Uchkuma пишет:
Щас необходимо понять, как будем определять, что строка является вопросом, а не ответом. У вопроса всегда двойной номер через точку?
Вообще при работе с текстовой базой данных почти всегда необходимо добавлять шифрование или экранирование исходный данных - в таком случае можно просто задать формат разделителя для вопросов и ответов и всегда однозначно выполнять обратное извлечение В данном случае достаточно иметь два разделителя - один их них будет определять разбиение вопросов а второй самих вариантов ответа - причем номера разделов и вопросов можно не разделять поскольку они однозначно извлекаются по позиции в строке Если автор хочет иметь текстовую БД с наглядным отображением и редактированем то можно выбрать такой формат - вопрос и варианты ответа отделяются символом новой строки а несколько вопросов между собой двумя таким символами - в таком случае придется экранировать слеш и символы \n для того чтобы вопрос мог сам включить символ переноса строки
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.