Эффективный способ прочитать большой текстовый файл с разделителями табуляции? - PullRequest
5 голосов
/ 19 мая 2011

У меня есть текстовый файл с разделителями табуляции с 500K записей. Я использую код ниже, чтобы прочитать данные для набора данных. С 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 ]

8 голосов
/ 19 мая 2011

Используйте потоковый подход с TextFieldParser - таким образом вы не загрузите весь файл в память за один раз.

3 голосов
/ 19 мая 2011

Вы действительно хотите перечислить исходный файл и обрабатывать каждую строку одновременно. Я использую следующее

    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;
            }
        }
    }

Затем для каждой строки вы можете разделить ее, используя вкладки, и обрабатывать каждую строку по очереди. Это сохраняет память очень низкой для синтаксического анализа, вы используете память только тогда, когда это требуется приложению.

0 голосов
/ 16 января 2012

Я нашел FileHelpers

FileHelpers - это бесплатная и простая в использовании библиотека .NET для импорта / экспорта данных фиксированной длины или записей с разделителями в файлах, строках или потоках.

Может быть, это может помочь.

0 голосов
/ 19 мая 2011

Вы пробовали 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();
  }
...