高效地读取c#中的.csv文件?

高效地读取c#中的.csv文件?,c#,csv,streamreader,C#,Csv,Streamreader,我通过以下方式读取巨大的csv文件(每个文件大约350K行): StreamReader readFile = new StreamReader(fi); string line; string[] row; readFile.ReadLine(); while ((line = readFile.ReadLine()) != null) { row = line.Split(';'); x=row[1];

我通过以下方式读取巨大的csv文件(每个文件大约350K行):

StreamReader readFile = new StreamReader(fi);
    string line;
    string[] row;
    readFile.ReadLine();
    while ((line = readFile.ReadLine()) != null)
    {
        row = line.Split(';');
        x=row[1];
        y=row[2];
        //More code and assignations here...
    }
    readFile.Close();
}

这里的要点是,在一个月的每一天逐行读取一个巨大的文件可能会很慢,我认为这一定是另一种更快的方法。

方法1

通过使用LINQ:

var Lines = File.ReadLines("FilePath").Select(a => a.Split(';'));
var CSV = from line in Lines 
          select (line.Split(',')).ToArray();
方法2

如前所述

下面是一个优秀的类,它将使用数据结构将CSV数据复制到数据表中,以创建数据表:

它易于配置和使用。我劝你看看

方法3

滚动您自己的CSV阅读器是浪费时间,除非您正在读取的文件保证非常简单。改为使用。

在一个简单的情况下(文件中没有引号,即,
'”
),当您希望进行部分读取时,您可能会发现有用

  var source = File
    .ReadLines(fileName)
    .Select(line => line.Split(';'));
例如,如果您想确定CSV中是否有一行3d列值等于
0

  var result = source
    .Any(items => items[2] == "0");

任何方法都必须读取整个文件。上一次我对
ReadLine()
循环与基于自定义缓冲区的方法(没有创建字符串,而是在缓冲区中创建小值类型偏移量大小对)进行基准测试时,为了节省您的时间,
ReadAllLines()
,可能重复循环出现在顶部。集中精力优化处理。小心使用
Split
ReadLine
解析csv,因为如果数据中的引号中包含分隔符或换行符,您将无法正确读取csv。使用类似Microsoft.VisualBasic.FileIO.TextFieldParser的方法更安全。可以吗您可以更详细地描述您的任务:您需要所有行还是只需要基于某种id列的特定行?您需要在UI上显示它,并且可以逐页惰性地加载它,还是需要处理整个文件?第一个操作是
file.ReadAllLines
,它会在li之前将整个文件内容拉入内存甚至使用了nq。@gunr2171我已经将其更改为ReadLines,因为
File.ReadLines()
返回一个
IEnumerable
,并且它不会一次读取整个文件,所以在处理大文件时,它确实是一个更好的选择。方法3应该是方法1。CSV很复杂!方法1不适用于“\n”(回车符)和/或字符串中的“;”(分号)。在一般情况下,无法使用拆分解析csv。