如何使txt文件转换更有效?

时间:2013-01-30 06:12:46

标签: c# console

我正在尝试读取txt文件(csv或制表符分隔)并将每行转换为Vector3并将其添加到数组然后进一步处理

到目前为止我的代码有效,但在文件中读取需要一段时间。每个正在读入的文件介于6 mb到25 mb之间

代码贯穿并完成了我的期望,但它似乎在这个foreach语句的某个地方出现了瓶颈?是否有更快的方式或者是否需要预期?

String[] pntsText = File.ReadAllLines(args[0]);
List<Vector3> pnts = new List<Vector3>();
Console.WriteLine("Start Building Points Array ...");
int noOfPnts = pntsText.Length;
int currentPntNo=0;
Console.CursorVisible = false;

foreach (string pntText in pntsText)
{
    currentPntNo++;
    Console.Clear();
    Console.Write(noOfPnts - currentPntNo + " left to process");
    string[] splitXYZ = pntText.Split(new string[] { args[1] }, StringSplitOptions.None);
    Vector3 ve2 = new Vector3(float.Parse(splitXYZ[0]), float.Parse(splitXYZ[1]), float.Parse(splitXYZ[2]));
    pnts.Add(ve2);
}

Console.WriteLine("Points Array Complete");

3 个答案:

答案 0 :(得分:3)

我认为问题在于您在控制台上的通知,您可以将它们评论出来并测试您是否获得更好的性能。我建议你使用Stopwatch为程序执行计时。

您还可以尝试以下LINQ查询来获取Vector3的列表。

List<Vector3> list

 = pntsText.Select(r => new { Splitted = r.Split(new string[] { "," }, StringSplitOptions.None) })
           .Select(t => new Vector3(float.Parse(t.Splitted[0]), float.Parse(t.Splitted[1]), float.Parse(t.Splitted[2])))
           .ToList();

但是这内部循环,所以我不确定你是否从中获得任何性能提升,并且在处理过程中你也不会在控制台上得到输出。

答案 1 :(得分:1)

您正在使用拆分方法拆分您的积分:

string[] splitXYZ = pntText.Split(new string[] 
  { args[1] }, StringSplitOptions.None);

在for循环中使用它并不是真正的高效,因为它为返回的数组对象分配内存,为每个数组元素分配一个String对象。考虑使用与Substring组合的IndexOf,我不确定你需要测试它的速度有多快。

关于此问题,请阅读Documentation

  

效果注意事项

     

Split方法为。分配内存   返回数组对象和每个数组元素的String对象。如果   您的应用程序需要最佳性能或管理内存   分配在您的应用程序中至关重要,请考虑使用IndexOf   或者IndexOfAny方法,以及可选的Compare方法,来定位a   字符串中的子字符串。

     

如果要拆分字符串   分隔符,使用IndexOf或IndexOfAny方法来定位   字符串中的分隔符。如果要拆分字符串   分隔符字符串,使用IndexOf或IndexOfAny方法来定位   分隔符字符串的第一个字符。然后使用Compare方法   确定第一个字符后面的字符是否为   等于分隔符字符串的剩余字符。

另一点是你正在为每个返回的点数组创建一个对象(Vector),包括Parse部分的3倍,这也会产生一些性能:

Vector3 ve2 = new Vector3(float.Parse(splitXYZ[0]), 
   float.Parse(splitXYZ[1]), float.Parse(splitXYZ[2]));

如果此时确实不需要(取决于您的需要),您可以将信息保存为文本形式甚至是结构,并在需要稍后处理它时创建Vector对象。

希望这有帮助

答案 2 :(得分:1)

将整个文件读入一个字符串并调用str.Split(new[] {',', '\n'})以获取所有向量部分的单个数组。然后循环,在3s解析它们。这样可以防止多次调用Split。还要避免在每次迭代时更新控制台。也许每100个?