如何使 xml 到 csv 解析/转换更快
本文关键字:转换 解析 csv 何使 xml | 更新日期: 2023-09-27 17:57:06
我目前正在使用以下代码片段将 xml 数据(格式不正确)转换为 .在两者之间进行一些处理后,CSV格式。它只转换 xml 数据中包含列表 testList (List<int> testList
) 中的整数的那些元素。它仅在进行匹配后转换并写入文件。我需要将此算法用于大小为几 GB 的文件。目前,它在 ~7.5 分钟内处理 1 Gb 文件。有人可以建议我可以进行的任何更改以提高性能吗?我已经修复了我能解决的所有问题,但它不会变得更快。任何帮助将不胜感激!
注意:Message.TryParse
是我必须使用的外部解析方法,无法排除或更改。注意:StreamElements
只是一个自定义的 Xmlreader,可以提高性能。
foreach (var element in StreamElements(p, "XML"))
{
string joined = string.Concat(element.ToString().Split().Take(3)) + string.Join(" ", element.
ToString().Split().Skip(3));
List<string> listX = new List<string>();
listX.Add(joined.ToString());
Message msg = null;
if (Message.TryParse(joined.ToString(), out msg))
{
var values = element.DescendantNodes().OfType<XText>()
.Select(v => Regex.Replace(v.Value, "''s+", " "));
foreach (var val in values)
{
for (int i = 0; i < testList.Count; i++)
{
if (val.ToString().Contains("," + testList[i].ToString() + ","))
{
var line = string.Join(",", values);
sss.WriteLine(line);
}
}
}
}
}
我看到一些你可以改进的地方:
- 您
joined
.ToString()
调用了几次,而joined
已经是一个字符串。 - 您可以通过在循环外先编译正则表达式来加快正则表达式替换速度。
- 您多次迭代
values
,每次都必须重新评估构成values
定义的 LINQ。在将该 LINQ 语句的结果保存到values
之前,请尝试使用.ToList()
。
但在关注这样的事情之前,你真的需要确定代码中花费了什么时间。我的猜测是,它几乎都花在了这两个地方:
- 从 XML 流读取
- 写信给
sss
如果我是对的,那么你关注的其他任何事情都将是不成熟的优化。花一些时间测试如果你注释掉for
循环的各个部分会发生什么,看看所有时间都花在哪里。