Манипуляции .txt WhatsApp резервного копирования - PullRequest
0 голосов
/ 05 мая 2019

Я искал способ манипулировать беседой о резервном копировании в .txt в WhatsApp, но я застрял.

Я хочу сохранить в список дату, время, дату, время пользователя и сообщение разговора.

Это «нормальный» формат текста:

5/31/18, 11:18 AM - User1: Hey
5/31/18, 11:18 AM - User2: what's up!
5/31/18, 3:19 PM - User1: Not much. 

Так что я жестко об этом решении:

while ((line = file.ReadLine()) != null)
            {
                if(line.Length > 0)
                {
                    list.Add(new Whatsapp()
                    {
                        DateTime= line.Substring(0, line.IndexOf("-")).Replace(",", "").Trim(),
                        Date= line.Substring(0, line.IndexOf(",")).Trim(),
                        Time= line.Substring(0, line.IndexOf("-")).Trim().Substring(line.Substring(0, line.IndexOf("-")).Trim().IndexOf(",") + 2),
                        User = line.Substring(line.IndexOf("-") + 2).Substring(0, line.Substring(line.IndexOf("-") + 2).IndexOf(":")).Trim(),
                        Message= line.Substring(line.IndexOf("-") + 2).Trim().Substring(line.Substring(line.IndexOf("-") + 2).Trim().IndexOf(":") + 2).Trim()

                    });
                }
            } 

И это работало, пока я не столкнулся с тем, что формат нарушается, когда в том же разговоре пользователь разбивает строку на сообщении, как:

5/31/18, 11:18 AM - User1: Hey
5/31/18, 11:18 AM - User2: what's up! 
5/31/18, 3:19 PM - User1: Not much. 
5/31/18, 3:20 PM - User2: Oh well..
Am I being annoying
doing
this
?
5/31/18, 3:19 PM - User1: Yep :(

Так что file.ReadLine() больше не работает, и я не знаю, как это обернуть. Какие-либо предложения?

1 Ответ

0 голосов
/ 05 мая 2019

Прежде всего, я хочу сказать, что анализ файла, основанный на предполагаемых положениях символов, является ужасной идеей, особенно если вы не имеете полного контроля над форматом данных.Все, что для этого потребуется, - это небольшие колебания, и все это не только не сработает, но, возможно, рухнет.Это, как говорится ...

while ((line = file.ReadLine()) != null)
{
    if (line.Length <= 0)
    {
        continue;
    }

    var firstComma = line.IndexOf(",");

    if (firstComma >= 0)
    {
        var possibleDate = line.Substring(0, firstComma);
        if (DateTime.TryParse(possibleDate, out _))
        {
            list.Add(new Whatsapp
            {
                DateTime = line.Substring(0, line.IndexOf("-")).Replace(",", "").Trim(),
                Date = line.Substring(0, line.IndexOf(",")).Trim(),
                Time = line.Substring(0, line.IndexOf("-")).Trim().Substring(line.Substring(0, line.IndexOf("-")).Trim().IndexOf(",") + 2),
                User = line.Substring(line.IndexOf("-") + 2).Substring(0, line.Substring(line.IndexOf("-") + 2).IndexOf(":")).Trim(),
                Message = line.Substring(line.IndexOf("-") + 2).Trim().Substring(line.Substring(line.IndexOf("-") + 2).Trim().IndexOf(":") + 2).Trim()
            });
        }
        else
        {
            list.Last().Message += $"{line.Trim()}\r\n";
        }
    }
    else
    {
        list.Last().Message += $"{line.Trim()}\r\n";
    }
}

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

Чтобы уточнить, что именно он делает сверх того, что вы уже делаете, поскольку он перебирает каждую строку, которую проверяет, чтобы увидеть, есть ли запятая, если нет, то он предполагает, что она должна быть частью сообщения последнеголиния (опасное действие № 1).Если есть запятая, то он пытается проанализировать текст до этой запятой в datetime, если не может, тогда он снова предполагает, что это часть сообщения последней строки (опасное действие номер 2).В противном случае он ведет себя так, как вы написали.

Несвязанные комментарии, почему вы храните вещи, которые DateTime как string с?Строки подстроки, которые вы назначаете объекту, почти не читаются, вы, вероятно, захотите вернуться к ним.Но так как они выходят за рамки вопроса, я просто оставлю их здесь в качестве пищи для размышлений.

Опять же, я знаю, что мои дополнения не изящны, но, опять же, анализ строк никогда не бывает.

...