我是使用C#读取文件数据的新手。我有一个大文本文件,其中的数据用逗号分隔。我想将此文件加载到我的应用程序(或域对象)中的DataTable
,但在执行此操作时我得到OutOfMemoryException
。我尝试了几种不同的方法,但仍然是同样的错误。似乎为了加载数据我需要以块的形式加载它,处理块然后存储它,然后获取下一个块然后处理它等等
如何使用StreamReader
执行此操作?我如何告诉StreamReader
在文件中读到哪里以及如何知道从哪里继续获取下一个块?
答案 0 :(得分:2)
你可以使用Buffer Stream来读取块数据,这里是代码
private void ReadFile(string filePath)
{
const int MAX_BUFFER = 20971520; //20MB this is the chunk size read from file
byte[] buffer = new byte[MAX_BUFFER];
int bytesRead;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read))
using (BufferedStream bs = new BufferedStream(fs))
{
while ((bytesRead = bs.Read(buffer, 0, MAX_BUFFER)) != 0) //reading only 20mb chunks at a time
{
//buffer contains the chunk data Treasure the moments with it . . .
//modify the buffer size above to change the size of chunk . . .
}
}
}
答案 1 :(得分:1)
您可以使用分页机制,其中您一次读取指定数量的行。使用File.ReadLines
方法,因为它只会在您访问行时将行读入内存。这是一些代码:
private static int pageNumber = 0;
const int PageSize = 10;
public static void Main()
{
IEnumerable<string> page;
List<string> lines = new List<string>();
while ((page = NextPage()).Any())
{
// Here I am simply throwing the contents into a List
// but you can show it in the DataTable
lines = page.ToList();
// Do processing
}
Console.Read();
}
private static IEnumerable<string> NextPage()
{
IEnumerable<string> page = File.ReadLines("Path")
.Skip(pageNumber * PageSize).Take(PageSize);
pageNumber++;
return page;
}