Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我更改了任何内容,是否可以更快地读取CSV文件?阅读是最好的方式吗?_C#_Performance_Csv_Readfile - Fatal编程技术网

C# 如果我更改了任何内容,是否可以更快地读取CSV文件?阅读是最好的方式吗?

C# 如果我更改了任何内容,是否可以更快地读取CSV文件?阅读是最好的方式吗?,c#,performance,csv,readfile,C#,Performance,Csv,Readfile,编辑:谢谢@Progressive的帮助,我当时正在匆忙写作,这一次需要检查拼写;) 我删除了数据库连接,这就是性能问题。我将研究代码,看看是否有什么我可以做的,以加快这部分代码。谢谢大家的见解 我试图读取大约50-100个CSV文件,行数在5000-20000之间。这需要很多时间,我的问题是,我的代码是否可以更快地执行,也许可以使用streamread或任何其他方法? 文件中的文本是这样构建的 123456789;罗伯特;1.2019-04-26;01;10;小时;巴黎 其中第一段是id,第二

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

我试图读取大约50-100个CSV文件,行数在5000-20000之间。这需要很多时间,我的问题是,我的代码是否可以更快地执行,也许可以使用streamread或任何其他方法? 文件中的文本是这样构建的 123456789;罗伯特;1.2019-04-26;01;10;小时;巴黎 其中第一段是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();
}
var filepath=Directory.GetFiles(@“C:\temp\”,“**.csv”);
foreach(文件路径中的字符串s)
{
var lines=File.ReadLines.Skip(1);
foreach(行中的var csvLine)
{
if(csvLine.Contains(“;”))
{
打破
}
列表值=新列表(csvLine.Split(“;”);
字符串id=值[0];
字符串日期=值[3];
var timestart=值[4];
//将“01”转换为01:00
int result=Convert.ToInt32(timestart);
TimeSpan hourTime=TimeSpan.FromHours(结果);
string fromTimeString=result.ToString(“HH”);
//设置timestart和time end
DateTime resultDate=DateTime.Parse(日期);
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;
//设置id
字符串dataId=id.ToString();
//总和
double-sumValue=double.Parse(值[4])*10;
/
var hourValue=myDB.HourValues.Where(w=>w.streamID==dataId&&w.TimeStart==TimeStart).FirstOrDefault();
if(hourValue==null)
{
hourValue=新的hourValue
{
streamID=dataId,
TimeStart=TimeStart,
TimeEnd=TimeEnd,
YearInt=年,
月,
DayInt=天,
小时=小时,
ResultTime=日期时间。现在,
SumValue=(十进制)SumValue,
};
myDB.HourValues.Add(hourValue);
}
其他的
{
hourValue.OriginalSum=hourValue.OriginalSum??hourValue.SumValue;
hourValue.ResultTime=DateTime.Now;
hourValue.SumValue=(十进制)SumValue;
}
}
myDB.SaveChanges();
}

我想看看我是否能更快地阅读这些文件。并感谢我对代码的任何帮助或洞察。

您可以始终使用多线程,使其在当前计算机上成为可能

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

由于并行的性质,它可以以任何顺序访问阵列,因此您需要构建一些考虑到这一点的东西


我建议的另一件事是使用两种方法。使用探查器读取文件的人。当它告诉您“热点”在哪里时,请努力改进代码的这些部分。重复。如果你的代码不正常工作,考虑把你的全部代码放在相反的位置。定义“慢”。另外,使用探查器查看哪些代码特别慢。查看哪一半代码慢的一个快速方法是注释掉
myDB.SaveChanges()行。若它的速度急剧加快,那个么你们就需要去看看了。试着运行代码而不保存到数据库,并比较时间。看看有多少时间是花在阅读上的。很长一段时间可能是写入数据库的时间。谢谢,我一开始确实使用了两种方法。但是当我添加更多的东西时,我决定把所有的东西都放在一个里面。但是我更喜欢用一种方法,而不是几种方法,所以也许我应该看看。不确定你提出的并行。For和ForEach在这种情况下是否能帮助我?顺序非常重要。您仍然可以维护顺序,只需在Parallel.For上使用索引器使用数组存储结果即可。类似的东西<代码>字符串[]线性阵列=新字符串[lines.Length];Parallel.For(0,lines.Length,indexer=>{//do转换linearray[indexer]=lines[indexer];})好的,我会调查并尝试。非常感谢。