2014-09-18 287 views
-1

我有一个包含我会用它来加载到我想创建自定义应用程序的GUID大文本文件。由于文件非常大(可能包含数百万行GUID),因此我想将其分解成多个部分并处理每个部分,然后移至下一部分,直至文件结束。文本文件的如何读取大文本文件并将其分解为批处理进行处理?

ASDFSADFJO23490234AJSDFKL 
JOGIJO349230420GJDGJDO230 
BJCIOJDFOBJOD239402390423 
JFWEIOJFOWE23904239N 
3490FJSDOFOIWEMO23MOFI23O 
FJWEIOFJWEIOFJOI23J230022 

让我们只说,该文本文件有99,000行,我要处理的第一10,000个值(重复进行,直到结束)。我将使用类似DateTime.Now作为文件夹名称的第一批10,000文件创建一个新文件夹。然后,10,000个值将分别具有使用其名称作为文件名创建的文件。在第一个10,000值完成后,我将再次使用DateTime.Now创建一个新文件夹,并移动到文本文件中的下一个10,000值。重复,直到文件结束。

我能够读取文本文件,使用DateTime.Now创建一个文件夹,使用相应的名称创建该文件,但我不知道如何从文本文件批处理值列表。

这是我如何读取文件。

string[] source = new string[] {}; 
source = File.ReadAllLines(@"C:\guids.txt"); 

我试过使用Skip/Take方法,我认为它的工作原理?但我只是不知道如何创建一个新文件夹并添加新的子集。任何帮助将不胜感激。我愿意接受建议,并且可以帮助澄清是否需要更多详细信息。谢谢!!

+0

如果您能够读取整个文件,那么您为什么要批处理? – 2014-09-18 19:42:02

+0

我想批处理的原因是因为当我将文件创建到文件夹(在Windows服务器上)时,我不想让所有对象都在该文件夹中。如果我在一个文件夹中有数百万个对象,它将在服务器上占用大量内存和处理资源。 – Jayarikahs 2014-09-18 19:47:03

+0

你想要做的不健全太难什么,我会第一个知道如何阅读和或分割的文件,如果需要第二个判断,如果你想使用while循环或foreach循环,然后设置逻辑创建文件并根据计数器的文件夹。当计数器击中特定计数..then你知道它的时间来重置counter..this需要一个嵌套的foreach循环在我看来.. – MethodMan 2014-09-18 19:55:29

回答

1

从评论,我推断你的问题其实也不是“我怎么批从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。某些无法预料的行为使您的代码尝试写入已存在的文件的可能性太高。

编辑:关于并行:只使用它,如果你需要它。这是总是比看起来更复杂,它有一个倾向,很难找到b。这就是说,这里有一个未经考验的的想法。

//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"); 
}); 
+0

感谢纪尧姆!你的代码工作。对于描述中的混淆,抱歉,我想我没有选择合适的词来描述我的问题(对我来说听起来没问题)。从前一篇文章中,有人提到了Parallel方法。你会碰巧知道如何做到这一点?我抬头看向Parallel,但对C#来说还是新手,所以我有点困惑。 – Jayarikahs 2014-09-18 20:32:16

+0

@Jayarikahs我添加了一些并行代码,但我没有测试它。让我知道它是如何工作的! – 2014-09-18 20:55:45

+0

我创建了一个小的测试文本文件(包含15个值,所以有15行),并在File.WriteAllText处找到错误(找不到路径C:\ zz \ 8 \ 09.txt的一部分)它确实创建了8个文件夹名称0-7),并为每个文件夹创建1个文件。我改变了source.Length/10000到source.Length/2 – Jayarikahs 2014-09-18 21:36:44

相关问题