在 c# 中有效地读取 .csv 文件? [关闭]

Posted

技术标签:

【中文标题】在 c# 中有效地读取 .csv 文件? [关闭]【英文标题】:Read a .csv file in c# efficiently? [closed] 【发布时间】:2016-05-28 00:18:24 【问题描述】:

我正在使用这种方式读取巨大的 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();

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

【问题讨论】:

任何方法都必须读取整个文件。 CSV parser/reader for C#?的可能重复 只是为了节省一些时间,我上次将ReadLine() 循环与基于缓冲区的自定义方法(没有创建字符串,而是将小值类型偏移大小对创建到缓冲区)与ReadAllLines() 相比,ReadLine() 循环排在首位。而是专注于优化您的处理。 小心使用SplitReadLine 解析csv,因为如果数据中的引号中有分隔符或换行符,您将读取错误。使用类似 Microsoft.VisualBasic.FileIO.TextFieldParser 的东西更安全。 您能否更详细地描述您的任务:您需要所有行还是仅需要基于某种 id 列的特定行?您需要在 UI 上显示它并且可以逐页延迟加载还是需要处理整个文件? 【参考方案1】:

方法一

通过使用 LINQ:

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

方法二

正如Jay Riggs 所述

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

A portable and efficient generic parser for flat files

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

方法3

滚动您自己的 CSV 阅读器是浪费时间,除非您正在阅读的文件保证非常简单。请改用pre-existing, tried-and-tested implementation。

【讨论】:

第一个操作是File.ReadAllLines,它在使用linq之前将整个文件内容拉入内存。 @gunr2171 我已将其更改为 ReadLines,因为 File.ReadLines() 返回一个 IEnumerable<string>,它不会一次读取整个文件,因此在处理大文件时它确实是一个更好的选择. 方法 3 应该是方法 1。CSV 很复杂! 方法 1 不适用于 '\n'(回车)和/或 ';' (分号)在字符串中。在一般情况下,无法使用 split 解析 csv。【参考方案2】:

在一个简单的情况下(文件中没有引用,即'"'),当您期望部分阅读时,您可能会发现有用

  var source = File
    .ReadLines(fileName)
    .Select(line => line.Split(';'));

例如,如果您想了解 CSV 中是否有一行 3d 列值等于 0

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

【讨论】:

以上是关于在 c# 中有效地读取 .csv 文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C# 中是不是有任何 CSV 读取器/写入器库? [关闭]

如何在 C# 中有效地从 SQL 数据读取器写入文件?

(54)C#里简单地读写CSV文件

(54)C#里简单地读写CSV文件

(54)C#里简单地读写CSV文件

在 C# 中有效地将数据插入 MySQL 中的多个表中