有效的方式来读取大型制表符分隔的txt文件?

时间:2011-05-18 21:32:13

标签: c# file-io tab-delimited

我有一个带有500K记录的制表符分隔的txt文件。我正在使用下面的代码将数据读取到数据集。使用50K它工作正常,但500K它给出了“类型'System.OutOfMemoryException'的异常被抛出。”

读取大型制表符分隔数据的更有效方法是什么? 或者如何解决这个问题?请举个例子

public DataSet DataToDataSet(string fullpath, string file)
{
    string sql = "SELECT * FROM " + file; // Read all the data
    OleDbConnection connection = new OleDbConnection // Connection
                  ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fullpath + ";"
                   + "Extended Properties=\"text;HDR=YES;FMT=Delimited\"");
    OleDbDataAdapter ole = new OleDbDataAdapter(sql, connection); // Load the data into the adapter
    DataSet dataset = new DataSet(); // To hold the data
    ole.Fill(dataset); // Fill the dataset with the data from the adapter
    connection.Close(); // Close the connection
    connection.Dispose(); // Dispose of the connection
    ole.Dispose(); // Get rid of the adapter
    return dataset;
}

4 个答案:

答案 0 :(得分:8)

使用TextFieldParser的流方法 - 这样您就不会一次性将整个文件加载到内存中。

答案 1 :(得分:3)

您确实想要枚举源文件并一次处理每一行。我使用以下

    public static IEnumerable<string> EnumerateLines(this FileInfo file)
    {
        using (var stream = File.Open(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (var reader = new StreamReader(stream))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }

然后,对于每一行,您可以使用制表符将其拆分并一次处理每一行。这使得内存在解析时保持很低,只有在应用程序需要时才使用内存。

答案 2 :(得分:0)

您是否尝试过TextReader?

  using (TextReader tr = File.OpenText(YourFile))
  {
      string strLine = string.Empty;
      string[] arrColumns = null;
      while ((strLine = tr.ReadLine()) != null)
      {
           arrColumns = strLine .Split('\t');
           // Start Fill Your DataSet or Whatever you wanna do with your data
      }
      tr.Close();
  }

答案 3 :(得分:0)

我找到了FileHelpers

  

FileHelpers 是一个免费且易于使用的.NET库,用于从文件,字符串或流中的固定长度或分隔记录中导入/导出数据。

也许它可以提供帮助。