2015-06-20 20 views
0

儘管文本文件中的行應該部分加密,但我還是有很多帶有值的文本文件。在文本文件中交換動態數量的行

一個文本文件的示例如下:(見編輯一個簡單的例子)

0.00;1.2;3;2015-20-06 13:33:33 
0.00;1.2;3;2015-20-06 13:33:34 
0.00;1.2;3;2015-20-06 13:33:35 
0.00;1.2;3;2015-20-06 13:33:36 
[RAND] 
0.00;1.2;3;2015-20-06 12:05:05 
0.00;1.2;3;2015-20-06 12:05:22 
0.00;1.2;3;2015-20-06 12:06:27 
0.00;1.2;3;2015-20-06 12:05:42 
[/RAND] 
0.00;1.2;3;2015-20-06 12:25:36 
0.00;1.8;3;2015-20-06 12:26:26 
0.00;1.2;3;2015-20-06 12:28:05 
[RAND] 
0.00;1.8;3;2015-20-06 12:32:22 
0.00;1.2;3;2015-20-06 12:33:04 
[/RAND] 

應把所有物品以隨機順序[RAND][/RAND]之間。 到目前爲止,我有以下,但我絕對不知道如何從這裏繼續或如果這是甚至正確的做法。

using (StreamReader reader = new StreamReader(LocalFile)) 
{ 
    bool InRegion = false; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      if (line.Equals("[RAND]")) 
        InRegion = true; 

       if (line.Equals("[/RAND]")) 
        InRegion = false; 
     } 
} 

我的一個擔心是,我使用的StreamReader和爲此不能更改文件。

RAND塊內可能有2行,但也有10行,每個文件有多個RAND塊。 有人可以解釋我該怎麼辦?

非常感謝。

編輯:

一個簡單的例子:

A 
B 
C 
[RAND] 
D 
E 
F 
[/RAND] 
G 
H 

應該再搶隨機順序與d,E和F的線,所以你得到的東西如下:

A 
B 
C 
E 
F 
D 
G 
H 
+0

你要什麼做什麼呢?我無法很好地理解你的問題 –

+0

我增加了另一個例子,使它更容易一些。基本上它應該打亂.txt文件中'[RAND]'和'[/ RAND]'之間的行順序。 – Roel

回答

2

導致大部分代碼(儘管可讀)的「龐大」方式將爲:

  • 閱讀所有線路,關閉文件
  • 找到塊隨機
  • 隨機化這些塊
  • 結果寫入新文件
  • 將新的文件覆蓋舊的文件

事情是這樣的:

var linesInFile = File.ReadAllLines(); 

var newLines = new List<string>(); 
var toRandomize = new List<string>(); 

bool inRegion = false; 

for (int i = 0; i < linesInFile.Count; i++) 
{ 
    string line = linesInFile[i]; 

    if (line == "[RAND]") 
    { 
     inRegion = true; 
     continue; 
    } 
    if (line == "[/RAND]") 
    { 
     inRegion = false;  
     // End of random block. 
     // Now randomize `toRandomize`, add it to newLines and clear it  
     newLines.AddRange(toRandomize); 
     toRandomize.Clear(); 
     continue; 
    } 

    if (inRegion) 
    { 
     toRandomize.Add(line); 
    } 
    else 
    { 
     newLines.Add(line); 
    } 
} 

File.WriteAllLines(newLines, ...); 

請參閱Randomize a List<T>以隨機化列表。

+0

非常感謝。沒有意識到我可以這樣讀線 - 非常有用! – Roel

0

我想用正則表達式其良好的

讀取文件的所有文字一次

並獲得隨機區

和替換它

隨機結果

以上步驟可以通過Replace方法RegEx類。

,最後保存新的內容到文件

例如:

var regExp = @"(\[RAND\])(\w|\s|\d)*(\[/RAND\])"; 
var res = Regex.Replace(str, regExp, match => 
{ 
     // suffle the and return result 
     // the return string replaced with occuring rand area 
     // for example with suffle algorithms 
     return "Randomized"; 
});