如果我进行任何更改,可以更快地读取CSV文件吗?阅读线是最好的方式吗?

时间:2019-04-26 12:34:07

标签: c# performance csv readfile

编辑:谢谢@Progressive的帮助,我急忙写作,一次是需要拼写检查的;) 我删除了数据库连接,这就是性能问题。我将研究代码,看看是否有什么我可以做的来加快那部分代码的速度。谢谢大家的见解!

我正在尝试读取5000-100000行之间的大约50-100个CSV文件。这需要花费很多时间,我的问题是我的代码是否可以用streamread或其他方法更快地执行? 文件中的文本是这样构建的 123456789; ROBERT; 1; 2019-04-26; 01; 10; HOUR; PARIS 其中第一段为id,第二名称,第三组,第四日期,第五小时,第六值和第七为“小时”来确定其格式,即八个城市,每行是另一个小时。

背景是我正在读取文件并将其插入SQL。顺便说一下,SQL连接已经建立。

我尝试使用File.ReadAllLines,但是速度较慢。 我将数据库中的savechanges移到了外部的foreach循环中以获得一些性能。它做了一点。不过,读取10000行的csv文件(600 KB)仍需要20分钟左右。 我还尝试使用要设置的参数制作一个类,但并没有提高性能。

var filePaths = Directory.GetFiles(@"C:\temp\", "**.csv");

foreach (string s in filePaths)
{
    var lines = File.ReadLines(s).Skip(1);

    foreach (var csvLine in lines)

    {
        if (csvLine.Contains(";;;;;"))
        {
            break;
        }

        List<string> values = new List<string>(csvLine.Split(';'));


        string id = values[0];
        string date = values[3];
        var timestart = values[4];

        //Convert "01" to 01:00
        int result = Convert.ToInt32(timestart);
        TimeSpan hourTime = TimeSpan.FromHours(result);
        string fromTimeString = result.ToString("HH");

        //Set timestart and time end
        DateTime resultDate = DateTime.Parse(date);
        DateTime timeStart = resultDate.Add(hourTime).AddHours(-2);
        DateTime timeEnd = timeStart.AddHours(1);


        var year = timeStart.Year;
        var month = timeStart.Month;
        var day = timeStart.Day;
        var hour = timeStart.Hour;

        //set id
        string dataId = id.ToString();

        //set sum
        double sumValue = double.Parse(values[4]) * 10;
        /

        var hourValue = myDB.HourValues.Where(w => w.streamID == dataId && w.TimeStart == timeStart).FirstOrDefault();

        if (hourValue == null)
        {
            hourValue = new HourValues
            {
                streamID = dataId,
                TimeStart = timeStart,
                TimeEnd = timeEnd,
                YearInt = year,
                MonthInt = month,
                DayInt = day,
                HourInt = hour,
                ResultTime = DateTime.Now,
                SumValue = (decimal)sumValue,


            };
            myDB.HourValues.Add(hourValue);
        }
        else 
        {
            hourValue.OriginalSum = hourValue.OriginalSum ?? hourValue.SumValue;
            hourValue.ResultTime = DateTime.Now;
            hourValue.SumValue = (decimal)sumValue;
        }
    }

    myDB.SaveChanges();
}

我想看看我能否以某种方式更快地读取文件。并感谢我能获得的任何帮助或对代码的了解。

1 个答案:

答案 0 :(得分:-3)

您始终可以使用多线程在当前计算机上实现该功能。

您可以使用Parallel.For或Parallel.ForEach。这将大大提高速度 您只需要在此示例上小心一点,因为顺序似乎很重要。

由于Parallel的本质,它可以以任何顺序访问数组,因此您需要构建一些考虑到这一点的东西。

我建议的另一件事是使用两种方法。读取文件的文件