如何读取大型文本文件并将其分解为批处理
本文关键字:分解 批处理 文件 文本 何读取 读取 大型 | 更新日期: 2023-09-27 18:22:35
我有一个大的文本文件,其中包含GUID,我将使用这些GUID加载到我试图创建的自定义应用程序中。由于这个文件太大了(可能包含数百万行GUID),我想把它分成几个部分,处理每个部分,然后移到下一个部分,直到文件结束。
文本文件示例
ASDFSADFJO23490234AJSDFKL JOGIJO349230420GJDGJDO230 BJCIOJDFOBJOD239402390423 JFWEIOJFOWE2390423901230N 3490FJSDOFOIWEMO23MOFI23O FJWEIOFJWEIOFJOI23J230022
比方说,文本文件有99000行,我想处理前10000个值(重复到最后)。我将为第一批10000创建一个新文件夹,使用DateTime。现在作为文件夹名称。然后,10000个值将分别使用其值名作为文件名创建一个文件。完成前10000个值后,我将使用DateTime创建一个新文件夹。现在再次移动到文本文件中的下10000个值。重复此操作,直到文件结束。
我可以读取文本文件,用DateTime创建一个文件夹。现在,用合适的名称创建文件,但我不知道如何批量处理文本文件中的值列表。
这就是我阅读文件的方式。
string[] source = new string[] {};
source = File.ReadAllLines(@"C:'guids.txt");
我试着使用Skip/Take方法,我认为它有效吗?但我只是不知道如何创建一个新的文件夹并将新的子集添加到其中。任何帮助都将不胜感激。我愿意接受建议,如果你需要更多细节,我可以帮助澄清。谢谢
从评论中,我推断您的问题实际上不是"如何从guid.txt中批处理读取?",而是"如何处理这些guid并在单独的文件夹中以一万为一组创建文件"。考虑到这一点,下面是一个如何做到这一点的例子。
var batchSize = 10000;
var source = File.ReadLines(@"C:'guids.txt");
var i = 0;
var currentDirPath = "";
foreach (var line in source)
{
if (i % batchSize == 0)
{
currentDirPath = Path.GetRandomFileName();
Directory.CreateDirectory(currentDirPath);
}
var newFile = Path.Combine(currentDirPath, line + ".txt");
File.WriteAllText(newFile, "Some content");
i++;
}
避免使用DateTime作为文件或文件夹名称。某些不可预见的行为使代码尝试写入已存在的文件的可能性太高了。
编辑:关于并行性:只有在需要的时候才使用它。它总是比看起来更复杂,而且有引入难以找到的错误的趋势。话虽如此,这里有一个未经测试的想法。
//Make sure the current folder is empty, otherwise the folders are very likely to already exist.
if (Directory.GetFiles(Directory.GetCurrentDirectory()).Any())
{
throw new IOException("Current directory is not empty.");
}
var batchSize = 10000;
var source = File.ReadAllLines(@"C:'guids.txt");
//Create the folders synchronoulsy to avoid race conditions.
var batchCount = (source.Length/batchSize) + 1;
for (int i = 0; i < batchCount; i++)
{
Directory.CreateDirectory(i.ToString());
}
source.AsParallel().ForAll(line =>
{
var folder = ((int)(Array.IndexOf(source, line) / batchSize)).ToString();
var newFile = Path.Combine(folder.ToString(), line + ".txt");
File.WriteAllText(newFile, "Some content");
});