我一直在寻找一种操作.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()
不再起作用,而且我现在不知道如何解决这个问题。有什么建议么?
答案 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
?您要分配给对象的子字符串行几乎是不可读的,您可能想重新访问它们。但是由于这些都不在问题的范围之内,所以我将它们留在这里供大家思考。
再次,我知道我的添加内容并不漂亮,但是再一次将字符串解析为从来都不是。