如何读取大型文本文件并将其分解为批处理

本文关键字:分解 批处理 文件 文本 何读取 读取 大型 | 更新日期: 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");
});