Разобрать и сформировать диалоги из TXT файла
Добрый день, помогите пожалуйста разобрать информацию из TXT, конвертировать ее в JSON, и вывести html. Текстовый файл содержит информацию о сообщениях между пользователями.
От кого: Пользователь Маша Зайцева (https://play.com/id1) 01.01.2022 в 02:25:28 да От кого: Пользователь Карина Васильева (https://play.com/id2) 01.01.2022 в 03:25:22 все От кого: Пользователь Ларис Викторовна ([url]https://play.com/id23/url]) 01.01.2022 в 03:28:22 Скинь сообщение Кому: Пользователь Ларис Викторовна (https://play.com/id3) 01.01.2022 в 04:25:11 вот держи Прикреплено сообщение #1 От кого: Пользователь Маша Зайцева (https://play.com/id4) 01.01.2022 в 02:25:28 да На выходе должно получиться Диалог с Пользоватем Маша Зайцева (https://play.com/id/...) (все сообщения с датой, прекреплениями ) Диалог с Пользоватем Карина Васильева (https://play.com/id/...) (все сообщения с датой, прекреплениями ) Диалог с Пользоватем Василиса Кондратьева (https://play.com/id/...) (все сообщения с датой, прекреплениями ) Диалог с Пользоватем Ларис Викторовна (https://play.com/id/...) (все сообщения с датой, прекреплениями ) |
Вы просите готовый скрипт с нуля.
Это работа, и за нее обычно платят деньги. Для таких сообщений предназначен раздел форума "Работа". Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела. |
const getText = `От кого: Пользователь Маша Зайцева ([url]https://play.com/id1[/url]) 01.01.2022 в 02:25:28 да От кого: Пользователь Карина Васильева ([url]https://play.com/id2[/url]) 01.01.2022 в 03:25:22 все От кого: Пользователь Ларис Викторовна ([url]https://play.com/id2[/url]) 01.01.2022 в 03:28:22 прикреплен файл #1 foto ([url]http://site.ru/a.png[/url]) Кому: Пользователь Ларис Викторовна ([url]https://play.com/id2[/url]) 01.01.2022 в 04:25:11 вот держи Прикреплено сообщение #1 От кого: Пользователь Маша Зайцева ([url]https://play.com/id4[/url]) 01.01.2022 в 02:25:28 да От кого: Пользователь Ларирс Викторовноа ([url]https://play.com/id23/url]) 01.01.2022 в 03:28:22 Скинь сообщени6е` let getmsg = [] getText.split('\n\n').forEach((item, index) => { const a = item.split('\n') let getA = a.slice(0, 1) == 'прикреплен файл #1' if (getA == false) { getmsg.push({ "stor": a.slice(0, 1)[0], "user": a.slice(0, 2)[1], "date": a.slice(1, 3)[1], "msg": a.slice(3)[0], "attachment": getA }) } else { // console.log(index) getmsg.push({ "stor": a.slice(0, 1)[0], "user": a.slice(0, 2)[1], "date": a.slice(1, 3)[1], "msg": a.slice(3)[0], "attachment": getA }) } }) //let user = getmsg.filter(item => item.user == 'Пользователь Ларис Викторовна (https://play.com/id2)'); console.log(getmsg) Добрый вечер, сейчас скрипт отрабатывает вроде как нужно, единственная проблема с прикреплением файла, строка идёт через \n после даты.., в связи с чем создаётся новый объект [ { "stor": "От кого:", "user": "Пользователь Маша Зайцева (https://play.com/id1)", "date": "01.01.2022 в 02:25:28", "msg": "да", "attachment": false }, { "stor": "От кого:", "user": "Пользователь Карина Васильева (https://play.com/id2)", "date": "01.01.2022 в 03:25:22", "msg": "все", "attachment": false }, { "stor": "От кого:", "user": "Пользователь Ларис Викторовна (https://play.com/id2)", "date": "01.01.2022 в 03:28:22", "attachment": false }, { "stor": "прикреплен файл #1 foto (http://site.ru/a.png)", "attachment": false }, { "stor": "Кому:", "user": "Пользователь Ларис Викторовна (https://play.com/id2)", "date": "01.01.2022 в 04:25:11", "msg": "вот держи", "attachment": false }, { "stor": "От кого:", "user": "Пользователь Ларирс Викторовноа ([url]https://play.com/id23/url])", "date": "01.01.2022 в 03:28:22", "msg": "Скинь сообщени6е", "attachment": false } ] |
SpaceAlarm, у тебя явные проблемы при работе с массивами... :(
К чему такое применение slice? :blink: |
Для того, что бы вырезать конкретный текст со строк
|
Цитата:
Цитата:
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9] const o = { stor: a.slice(0, 1)[0], user: a.slice(0, 2)[1], date: a.slice(1, 3)[1], msg: a.slice(3)[0], } alert(JSON.stringify(o)) Аналог твоего творения const a = [1, 2, 3, 4, 5, 6, 7, 8, 9] const o = { stor: a[0], user: a[1], date: a[2], msg: a[3], } alert(JSON.stringify(o)) |
Я только учусь...)) прошу прощения.. а вот по поводу того что после даты нет msg и далее через \n идёт прикрепление, это косяк в split ?
В общем какая ситуация, данный код должен обрабатывать диалог с txt файла, кто мне написал и кому написал я, где идёт обычный диалог, работает вроде нормально, а вот где я или человек прикрепил какую то ссылку, файл, и т.д., там нет поля для сообщения, далее через отступ идёт прикрепление, после чего опять отступ и следующие сообщение |
Цитата:
|
Работает, но правильно ли сделал?
let indexT = getmsg.findIndex(x => x.stor === 'прикреплен файл #1 foto ([url]http://site.ru/a.png[/url])') getmsg[indexT -1].msg = getmsg[indexT].stor console.log(getmsg) |
Цитата:
Т.ч. про "правильность" не могу судить. :no: |
Ситуация такая, происходит диалог между людьми, если человек написал сообщение (текст) получаем один объект:
{ "stor": "От кого:", "user": "Пользователь Карина Васильева (https://play.com/id2)", "date": "01.01.2022 в 03:25:22", "msg": "все", "attachment": false }, Если человек отправил вложение (ссылку например) Получаем 2 разных объекта, потому что разделителем служит \n как новая строка { "stor": "От кого:", "user": "Пользователь Карина Васильева (https://play.com/id2)", "date": "01.01.2022 в 03:25:22", "attachment": false }, { "stor": "прикреплен файл #1 foto (http://site.ru/a.png)", "attachment": false }, Как видим отсутствует 'msg', потому что в текстовом файле с диалогом, отсутствует само сообщение (вместо него \n), но через строку \n у нас есть вложение. Сам диалог между людьми делится через \n\n Пользователь Ларис Викторовна ([url]https://play.com/id2[/url]) 01.01.2022 в 03:28:22 прикреплен файл #1 foto ([url]http://site.ru/a.png[/url]) Вот я и пытаюсь найти строки где есть прикреплён файл, и приобщить их к предыдущему сообщению Либо же в самом начале при делении диалогов необходимо организовать деление От кого и кому. Пытался через регулярку в getText.split('\n\n').... Но не вышло, это оказалось самым оптимальным вариантом |
<pre id="result" style="margin-bottom: 15px"></pre> <pre id="text-to-parse" contenteditable> От кого: Пользователь Маша Зайцева (https://play.com/id1) 01.01.2022 в 02:25:28 да От кого: Пользователь Карина Васильева (https://play.com/id2) 01.01.2022 в 03:25:22 все От кого: Пользователь Ларис Викторовна ([url]https://play.com/id23/url]) 01.01.2022 в 03:28:22 Скинь сообщение Кому: Пользователь Ларис Викторовна (https://play.com/id3) 01.01.2022 в 04:25:11 вот держи Прикреплено сообщение #1 От кого: Пользователь Маша Зайцева (https://play.com/id4) 01.01.2022 в 02:25:28 да От кого: Пользователь Ларис Викторовна ([url]https://play.com/id2[/url]) 01.01.2022 в 03:28:22 прикреплен файл #1 foto ([url]http://site.ru/a.png[/url]) </pre> <script> const messagePattern = [ '^(?<direction>От кого|Кому):\\n', '^Пользователь (?<user_name>.+)(?:\\n|\\s)\\((?<user_link>.+)\\)\\n', '^(?<date>\\S+) в (?<time>.+)\\n', '^(?<message>.*)\\n?', '(?:' + '(?<=\\n{2})' + '^Прикреплен файл (?<file_name>.+) \\((?<file_link>.+)\\)' + ')?', ].join(''); const forwardedMessagePattern = [ '(?<forwarded_message>', '^Прикреплено сообщение (?<forwarded_message_number>.+)\\n', messagePattern.replace(/\?<(\w+)>/guim, '?<forwarded_message_$1>'), ')?\\n?', ].join(''); const pattern = `${messagePattern}\\n?${forwardedMessagePattern}`; const messageRegex = new RegExp(pattern, 'uim'); const messagesRegex = new RegExp(pattern, 'guim'); const getMessages = (string) => string.match(messagesRegex); const parseMessage = (message) => message.match(messageRegex)?.groups; (node => { const resultContainer = document.querySelector('#result'); if (!resultContainer || !node) { return; } node.addEventListener('input', () => { const data = getMessages(node.textContent)?.map(message => parseMessage(message)); resultContainer.textContent = JSON.stringify(data, null, 4); }); node.dispatchEvent(new Event('input')); })(document.querySelector('#text-to-parse')); </script> |
Вообще полностью переделал, спасибо большое!!! Сразу видно, опыт...))
А подскажите пожалуйста, с моим вариантом все же как бы поступили ? В разделителе бы применили другую регулярку или же перемещали на индекс назад? Для себя чтобы понимать... |
SpaceAlarm, я не особо вникал, что вы пытались сделать и в чем у вас сложность возникла, но работать с текстом построчно вообще бы стал.
Разбил бы текст на отдельные сообщения и уже потом парсил бы их по очереди, а не пытался прыгать от одного к другому по определенным условиям. |
Nexus, я именно так и делал изначально, получил из текстового файла весь текст, потом через split разбил по \n так как после последнего сообщения идёт \n, проблема была в том, что если человек отправляет вложение какое-то, то там где должен быть текст сообщения, строка пустая, и через \n новая строка с вложением. В связи с чем и получалось, что если есть текст сообщения то все нормально, если человек отправил вложение то получилось 2 разных объекта
|
Цитата:
Upd. вы неправильно выбрали разделитель (separator), двойной вертикальный пробел - не лучшее решение, т.к. само сообщение может содержать несколько пустых строк. У вас каждое новое сообщение начинается со слов "От кого" либо "Кому", эти фразы и стоило использовать в кач-ве разделителя. const text = `От кого: Пользователь Маша Зайцева ([url]https://play.com/id1[/url]) 01.01.2022 в 02:25:28 да От кого: Пользователь Карина Васильева ([url]https://play.com/id2[/url]) 01.01.2022 в 03:25:22 все От кого: Пользователь Ларис Викторовна ([url]https://play.com/id23/url]) 01.01.2022 в 03:28:22 Скинь сообщение Кому: Пользователь Ларис Викторовна (https://play.com/id3) 01.01.2022 в 04:25:11 вот держи Прикреплено сообщение #1 От кого: Пользователь Маша Зайцева (https://play.com/id4) 01.01.2022 в 02:25:28 да От кого: Пользователь Ларис Викторовна ([url]https://play.com/id2[/url]) 01.01.2022 в 03:28:22 прикреплен файл #1 foto ([url]http://site.ru/a.png[/url]) `; const segments = text.split(/(?<!прикреплено сообщение .+?\n)(от кого|кому)/iu).filter(Boolean); const messages = segments.reverse().reduce((res, segment) => { if (['от кого', 'кому'].includes(segment.toLowerCase())) { res[res.length - 1] = segment + res[res.length - 1]; } else { res.push(segment); } return res; }, []).reverse(); console.log(messages) |
Спасибо большое!! Теперь понял вроде...
|
Часовой пояс GMT +3, время: 12:17. |