2014-09-18 42 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

相關問題