操作.txt WhatsApp备份

时间:2019-05-05 01:35:00

标签: c# readline

我一直在寻找一种操作.txt WhatsApp备份对话的方法,但现在我陷入了困境。

我想将对话的日期时间,日期,时间,用户和消息保存到列表中。

这是txt的“常规”格式:

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 :(得分:0)

首先,我想说的是,基于假定的字符位置来解析文件是一个可怕的想法,尤其是在您无法完全控制数据格式的情况下。它所需要的只是一些小小的波动,您的整个事情不仅不起作用,而且可能崩溃。话虽这么说...

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)。如果有逗号,则尝试将直到该逗号为止的文本解析为日期时间,如果不能,则再次假定它是最后一行消息的一部分(危险动作编号2)。否则,它会像您写的那样工作。

无关的注释,为什么将DateTime的内容存储为string?您要分配给对象的子字符串行几乎是不可读的,您可能想重新访问它们。但是由于这些都不在问题的范围之内,所以我将它们留在这里供大家思考。

再次,我知道我的添加内容并不漂亮,但是再一次将字符串解析为从来都不是。