Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 08.09.2024, 11:46
Кандидат Javascript-наук
Отправить личное сообщение для SpaceAlarm Посмотреть профиль Найти все сообщения от SpaceAlarm
 
Регистрация: 05.05.2016
Сообщений: 103

Ситуация такая, происходит диалог между людьми, если человек написал сообщение (текст) получаем один объект:

{
    "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').... Но не вышло, это оказалось самым оптимальным вариантом

Последний раз редактировалось SpaceAlarm, 08.09.2024 в 12:02.
Ответить с цитированием
  #12 (permalink)  
Старый 08.09.2024, 13:12
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,790

<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>

Последний раз редактировалось Nexus, 08.09.2024 в 13:47. Причина: fix typo
Ответить с цитированием
  #13 (permalink)  
Старый 08.09.2024, 13:31
Кандидат Javascript-наук
Отправить личное сообщение для SpaceAlarm Посмотреть профиль Найти все сообщения от SpaceAlarm
 
Регистрация: 05.05.2016
Сообщений: 103

Вообще полностью переделал, спасибо большое!!! Сразу видно, опыт...))
А подскажите пожалуйста, с моим вариантом все же как бы поступили ? В разделителе бы применили другую регулярку или же перемещали на индекс назад? Для себя чтобы понимать...
Ответить с цитированием
  #14 (permalink)  
Старый 08.09.2024, 13:41
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,790

SpaceAlarm, я не особо вникал, что вы пытались сделать и в чем у вас сложность возникла, но работать с текстом построчно вообще бы стал.
Разбил бы текст на отдельные сообщения и уже потом парсил бы их по очереди, а не пытался прыгать от одного к другому по определенным условиям.
Ответить с цитированием
  #15 (permalink)  
Старый 08.09.2024, 13:51
Кандидат Javascript-наук
Отправить личное сообщение для SpaceAlarm Посмотреть профиль Найти все сообщения от SpaceAlarm
 
Регистрация: 05.05.2016
Сообщений: 103

Nexus, я именно так и делал изначально, получил из текстового файла весь текст, потом через split разбил по \n так как после последнего сообщения идёт \n, проблема была в том, что если человек отправляет вложение какое-то, то там где должен быть текст сообщения, строка пустая, и через \n новая строка с вложением. В связи с чем и получалось, что если есть текст сообщения то все нормально, если человек отправил вложение то получилось 2 разных объекта
Ответить с цитированием
  #16 (permalink)  
Старый 08.09.2024, 16:00
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,790

Сообщение от SpaceAlarm
получил из текстового файла весь текст, потом через split разбил по \n
В итоге получили массив строк, я же предложил разбить весь текст сначала на массив отдельных сообщений (string[]), а потом уже эти сообщения разбирать, как вам захочется.

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)

Последний раз редактировалось Nexus, 08.09.2024 в 16:25.
Ответить с цитированием
  #17 (permalink)  
Старый 08.09.2024, 17:39
Кандидат Javascript-наук
Отправить личное сообщение для SpaceAlarm Посмотреть профиль Найти все сообщения от SpaceAlarm
 
Регистрация: 05.05.2016
Сообщений: 103

Спасибо большое!! Теперь понял вроде...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из txt выбрать нужные строки и сформировать csv SergeyPetrovA Общие вопросы Javascript 16 12.12.2016 14:22
Считывание из txt файла Esca Оффтопик 8 24.06.2015 18:58
на php как быстро записать массив из большого файла txt? wadim Общие вопросы Javascript 4 18.03.2014 19:09
считывание с txt файла maikusha Общие вопросы Javascript 2 02.03.2012 08:41
Чтение и запись с txt или csv файла vitaver AJAX и COMET 0 23.12.2010 20:43