我有以下方法,使用Yield Return从文件中读取大(> 1m)行文本。
private static IEnumerable<string> ReadLineFromFile(TextReader fileReader)
{
using (fileReader)
{
string currentLine;
while ((currentLine = fileReader.ReadLine()) != null)
{
yield return currentLine;
}
}
}
我需要能够将从此方法返回的每10行写入不同的文件。
如何在不枚举所有行的情况下使用此方法?
非常感谢任何答案。
答案 0 :(得分:1)
我想我终于开始工作了: - )
var listOfBufferedLines = ReadLineFromFile(ReadFilePath);
var listOfLinesInBatch = new List<string>();
foreach (var line in listOfBufferedLines)
{
listOfLinesInBatch.Add(line);
if (listOfLinesInBatch.Count % 1000 == 0)
{
Console.WriteLine("Writing Batch.");
WriteLinesToFile(listOfLinesInBatch, LoadFilePath);
listOfLinesInBatch.Clear();
}
}
// writing the remaining lines
WriteLinesToFile(listOfLinesInBatch, LoadFilePath);
答案 1 :(得分:0)
如果您运行以下代码,您可以看到您需要做的就是在foreach循环中调用您的方法,并且它将一次迭代一个,您只需将其缓冲到某个批量大小的选择。
static void Main (string [] args)
{
int batch_size = 5;
string buffer = "";
foreach (var c in EnumerateString("THISISALONGSTRING"))
{
// Check if it's time to split the batch
if (buffer.Length >= batch_size)
{
// Process the batch
buffer = ProcessBuffer(buffer);
}
// Add to the buffer
buffer += c;
}
// Process the remaining items
ProcessBuffer(buffer);
Console.ReadLine();
}
public static string ProcessBuffer(string buffer)
{
Console.WriteLine(buffer);
return "";
}
public static IEnumerable<char> EnumerateString(string huh)
{
for (int i = 0; i < huh.Length; i++) {
Console.WriteLine("yielded: " + huh[i]);
yield return huh[i];
}
}
答案 2 :(得分:0)
绝对不是解决这个问题的优雅方法,但它会起作用
static void Main(string[] args)
{
try
{
System.IO.TextReader readFile = new StreamReader(@"C:\Temp\test.txt");
int count = 0;
List<string> lines= new List<string>();
foreach (string line in ReadLineFromFile(readFile))
{
if (count == 10)
{
count = 0;
ProcessChunk(lines);
lines.Add(line);
}
else
{
lines.Add(line);
count++;
}
}
//PROCESS the LINES
ProcessChunk(lines);
Console.ReadKey();
}
catch (IOException ex)
{
Console.WriteLine(ex.ToString());
}
}
private static void ProcessChunk(List<string> lines)
{
Console.WriteLine("----------------");
lines.ForEach(l => Console.WriteLine(l));
lines.clear();
}
private static IEnumerable<string> ReadLineFromFile(TextReader fileReader)
{
using (fileReader)
{
string currentLine;
while ((currentLine = fileReader.ReadLine()) != null)
{
yield return currentLine;
}
}
}