【发布时间】:2019-01-09 18:19:20
【问题描述】:
我有一个正在尝试解析的格式化日志文件;该文件分为带有标题的部分,每个部分中的数据都使用 JSON 格式,如下所示。 Link to an extract of the log file here
[UnityCrossThreadLogger]1/8/2019 7:49:19 PM
==> Deck.GetDeckLists(112):
{
"jsonrpc": "2.0",
"method": "Deck.GetDeckLists",
"params": {},
"id": "112"
}
我的问题是以某种方式处理整个字符串,以到达我想要的部分,然后剥离无意义的数据并通过Newtonsoft JSON 解析剩余的数据。现在我正在使用此功能删除我不需要的所有内容,因为日志文件是按时间顺序排列的,并且只需要最近出现的条目:
//Cut the whole log to the last entry
private static string CutLog(string fromWhereToCut)
{
string log = GetLog();
//In this case fromWhereToCut would be "Deck.GetDeckLists"
string s = log.Substring(log.LastIndexOf(fromWhereToCut));
return s;
}
问题在于,在反序列化 JSON 之前,我将标头保留在我需要删除的位置,并且 它很容易损坏,因为部分的名称不是那么独特 并且它们可以作为非标题标题进一步重复(如我的示例所示)。此外,在另一节开始之前,我不知道如何在我需要的部分结束时停下来。
我认为可以使用 RegEx,但即使对于 RegEx,这似乎也很大,也许有更好的解决方案。
【问题讨论】:
-
是否有可能照顾'{'的第一次出现?
-
string s = log.Substring(log.LastIndexOf(fromWhereToCut) + fromWhereToCut.Length);? -
@MikNiller 正如您在 Pastebin 中看到的(尤其是在最后一节中),它比这更复杂。
-
@AhmedAbdelhameed 这会给我留下可变数量的字符(括号“112”之间的部分),这些字符在日志文件的每次迭代中都会发生变化,这意味着一旦我可以获得 (112) 和另一个 ( 1).
-
我明白了,那么另一个想法可能是寻找 [ 或 { ,当找到其中一个时,继续在字符串中搜索相同类型的匹配字符,然后将两者之间的数据提取为json,继续,直到字符串结束。可能效率不高,正则表达式大师很可能有更好的解决方案您需要通过保留某种引用计数来跟踪您正在搜索的块内的其他 { [