如何使 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);
                                }
                            }
                        }
                    }
    }

如何使 xml 到 csv 解析/转换更快

我看到一些你可以改进的地方:

  • joined .ToString()调用了几次,而joined已经是一个字符串。
  • 您可以通过在循环外先编译正则表达式来加快正则表达式替换速度。
  • 您多次迭代values,每次都必须重新评估构成values定义的 LINQ。在将该 LINQ 语句的结果保存到 values 之前,请尝试使用 .ToList()

但在关注这样的事情之前,你真的需要确定代码中花费了什么时间。我的猜测是,它几乎都花在了这两个地方:

  1. 从 XML 流读取
  2. 写信给sss

如果我是对的,那么你关注的其他任何事情都将是不成熟的优化。花一些时间测试如果你注释掉for循环的各个部分会发生什么,看看所有时间都花在哪里。