Как лениво загружать строки DataTable из большого текстового файла с помощью IEnumerable и возврата результата в C#?C#

Место общения программистов C#
Ответить
Anonymous
 Как лениво загружать строки DataTable из большого текстового файла с помощью IEnumerable и возврата результата в C#?

Сообщение Anonymous »

Я работаю над приложением C#, в котором мне нужно прочитать очень большой текстовый файл и преобразовать его содержимое в DataTable. Однако мне не всегда нужны все строки, поэтому я хочу избежать предварительной загрузки всего файла в память.
Вместо этого я хочу лениво генерировать объекты DataRow только тогда, когда они действительно нужны. Моя цель — реализовать метод, который возвращает IEnumerable и использует возврат доходности, чтобы строки передавались из файла и потреблялись на лету с помощью цикла foreach.
Вот чего я пытаюсь достичь:
Чтение файла построчно, без буферизации всего файла.
Преобразуйте каждую строку в DataRow на основе предопределенного столбца.
Используйте возврат доходности для ленивого возврата каждой строки.
Начинайте читать и генерировать строки только тогда, когда цикл foreach начинает потреблять данные.
Совместим ли этот подход с DataTable или мне следует рассмотреть альтернативную структуру, которая лучше поддерживает отложенное создание строк?
Например, в приведенном ниже коде, когда я хочу просматривая данные с помощью оператора foreach, я хочу, чтобы данные загружались из внешнего источника, например файла.

Код: Выделить всё

public static void Main()
{
var datatable = ConvertExcelToDataTable();

//I Want Load Rows From File Now
foreach (var item in datatable.Rows)
{

}
}
public static DataTable ConvertExcelToDataTable()
{
var datatable = new DataTable();
datatable.Columns.Add("Id");
datatable.Columns.Add("Name");

//The following line has an error because datatable.rows is read-only.
datatable.Rows = GetRowsFromExcel(datatable);

return datatable;
}
static IEnumerable GetRowsFromExcel(DataTable datatable)
{
string filePath = "data.csv";

using (var reader = new StreamReader(filePath))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
var row = datatable.NewRow();
row["Id"] = values[0];
row["Name"] = values[1];
yield return row;
}
}
}
Будем очень признательны за любые советы, шаблоны или примеры кода.

Подробнее здесь: https://stackoverflow.com/questions/797 ... able-and-y
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»