2012-12-23 145 views
0

我正在构建一个WPF程序,该程序正在编辑一个模拟程序的保存文件,以便更容易地调整某些参数。即(TXT)文件的结构看起来像这样查找文件中的特定文本并替换该文件

{Verdieping 1} 

A bunch of data 

'Max' 
15 
20 
10 
]); 

More data 

{Verdieping 2} 

A bunch of data 

'Max' 
25 
10 
40 
20 
]); 

More data 

{Verdieping 3} 

etc. 

因为名单,我需要的名字始终是“最大”我不能使用Replace("Old_Value", "New_Value");所以我必须要想办法找到头{Verdieping 1}然后寻找“最大”,写的值,直到它达到‘]);’,所以我最终的东西是这样的:

Verdieping_1[0] = 15 
Verdieping_1[1] = 20 
Verdieping_1[0] = 10 

Verdieping_2[0] = 25 
Verdieping_2[1] = 10 
Verdieping_2[2] = 40 
Verdieping_2[3] = 20 

后来,当我改变这些值我需要将它们写回的文件正确的位置现在我正在使用这段代码来读取并最终写入新文件:

var Model = System.IO.File.ReadAllText(@"C:\Base_Model.txt"); 

//format code here... 

System.IO.File.WriteAllText(@"C:\New_Model.txt", Model); 

有人能给我一些提示或帮助,我该如何最好地解决这个问题?

编辑 这是文件的实际文件结构我想eddit:

{Atom: Verdieping 2} 

int015(0, 64, [ 
1 
2 
3 
]); 
int015(1, 64, [`ActivityID` 
20 
21 
33 
]); 
int015(2, 64, [`vtp` 
139830296 
189540320 
169919424 
]); 
int015(3, 64, [`%` 
100 
100 
100 
]); 
int015(4, 64, [`Max` 
15 
5 
20 
]); 
int015(5, 64, [`Fill (1 = fill, 0 = empty)` 
1 
1 
0 
]); 
SetStatus(0); 
int018; 


{Atom: Verdieping 2} 

int015(0, 64, [ 
1 
2 
3 
]); 
int015(1, 64, [`ActivityID` 
22 
23 
24 
]); 
int015(2, 64, [`vtp` 
166058172 
165557860 
155960564 
]); 
int015(3, 64, [`%` 
100 
100 
100 
]); 
int015(4, 64, [`Max` 
15 
20 
10 
]); 
int015(5, 64, [`Fill (1 = fill, 0 = empty)` 
0 
1 
1 
]); 
SetStatus(0); 
int018; 

'最大' 我早先提到实际上是所谓: int015(4,64,[ Max

正如可以看到的名字是为每个离开的层相同,变量的量是不同的寿。

由于FO到目前为止的帮助!

+0

“有些想法?”听起来像解析器。 –

+0

听起来像你应该使用Xml而不是文本文件 –

+0

也想到XML。 – dotTutorials

回答

0

正则表达式可能吗?我做了这个快速的答复,不应该复制粘贴,但是;你可以考虑结果。

在这个答案我期待你的数组按照时间顺序,以防止源代码太长和混乱。

我读了“DataContainer”对象的文件看起来与下面的文件相同的:在字符串中

{Verdieping 1} 

A bunch of data 

'Max' 
15 
20 
10 
]); 

More data 

{Verdieping 2} 

A bunch of data 

'Max' 
25 
10 
40 
20 
]); 

首先我觉得每个“最大” 然后我把下面的所有DATAS和打印出来

正则表达式用来发现这是:\'Max\'.*?\]\);

出来试试这个代码,看看结果

// fill our container 
      string DataContainer = string.Empty; 
      using (StreamReader sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TestFile.txt"))) { 
       DataContainer = sr.ReadToEnd(); 
      } 

      // print data 
      Match regMatch = Regex.Match(DataContainer, @"\'Max\'.*?\]\);", RegexOptions.Singleline); 
      int verdiepc = 0; 
      while (regMatch.Success) { 
       string[] Data = regMatch.Value.Replace("\r", "").Split('\n'); 

       for (int I = 1; I < Data.Length - 1; I++) { 
        Console.WriteLine("Verdieping_{0}[{1}] = {2}" 
         , verdiepc, I, Data[I]); 
       } 
       Console.Write("\n"); 

       verdiepC++; 
       regMatch = regMatch.NextMatch(); 
      } 

      // prevent immidiate exit 
      Console.ReadKey(); 

输出将是:

Verdieping_0[1] = 15 
Verdieping_0[2] = 20 
Verdieping_0[3] = 10 

Verdieping_1[1] = 25 
Verdieping_2[2] = 10 
........ etc.. 

我希望你可以使用这个答案。这是你如何使用正则表达式来解析该文件

0
 string LoadedFile = File.ReadAllText(@"C:\Base_Model.txt"); 
     StringBuilder result = new StringBuilder(); 
     for (int i = 1; i < Int32.MaxValue; i++) 
     { 
      Match ma = Regex.Match(LoadedFile, "Verdieping " + i.ToString() + ".+?'Max'.*?([0-9].+?)[]][)];", RegexOptions.Singleline); 
      if(!ma.Success) 
      { 
       break; 
      } 
      string a = ma.Result("$1"); 
      MatchCollection mc = Regex.Matches(a, "(\\d+?)\r\n", RegexOptions.Singleline); 

      for (int j = 0; j < mc.Count; j++) 
      { 
       result.AppendLine(String.Format("Verdieping_{0}[{1}] = {2}", i, j, mc[j].Result("$1"))); 
      } 
      result.AppendLine(String.Empty); 
     } 

     File.WriteAllText(@"C:\New_Model.txt", result.ToString()); 
1
var result = Regex.Matches(File.ReadAllText(fileName), @"\[`Max`(.*?)\]", RegexOptions.Singleline) 
      .Cast<Match>() 
      .Select(m => m.Groups[1].Value.Split(" \t\n\r".ToArray(), StringSplitOptions.RemoveEmptyEntries)) 
      .ToList(); 

foreach (var v in result) 
{ 
    Console.WriteLine(String.Join(", ", v)); 
} 

输出草图:

15, 5, 20 
15, 20, 10 
0

您可以初始化一个新的string其中将包含所需输出的List。然后,读取获取目标部分之间的信息的文件,并将[]);之间的值插入Liststring

static List<string> ReadFile(string Path, string Section) 
{ 
    #region Declare Variables 
    string[] Lines = File.ReadAllLines(Path); //Read Path into Lines 
    int CurrentValue = 1; //Declare CurrentValue as an Integer of value 1 
    List<string> RequiredValues = new List<string>(); //Initialize a new List of string of name RequiredValues 
    #endregion 
    #region Collect Information 
    //Look through the section getting the data between [ and ]); 
    for (int i = 0; i < Lines.Length; i++) 
    { 
     if (Lines[i].StartsWith("{" + Section + "}")) 
     { 
      i++; 
      while (!Lines[i].StartsWith("{") && !Lines[i].EndsWith("}")) 
      { 
       i++; 
       if (Lines.Length > i) 
       { 
        if (Lines[i].Contains('[')) 
        { 
         while (true) 
         { 

          i++; 
          if (Lines[i].Contains("]);")) 
          { 
           break; 
          } 
          RequiredValues.Add(Section + "[" + CurrentValue.ToString() + "] = " + Lines[i]); 
          CurrentValue++; 
         } 
        } 
        RequiredValues.Add(""); 
       } 
       else 
       { 
        break; //Reached the end of the document 
       } 
      } 
     } 
    } 
    #endregion 
    return RequiredValues; //Return RequiredValues 
} 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    List<string> Contents = ReadFile(@"C:\Base_Model.txt", "Atom: Verdieping 2"); 
    foreach (string str in Contents) 
    { 
     System.Diagnostics.Debug.WriteLine(str); //Write str to the trace listeners 
    } 
} 

采样输入

{Atom: Verdieping 2} 

int015(0, 64, [ 
4 
5 
6 
]); 
int015(1, 64, [`ActivityID` 
20 
21 
33 
]); 
int015(2, 64, [`vtp` 
139830296 
189540320 
169919424 
]); 
int015(3, 64, [`%` 
100 
100 
100 
]); 
int015(4, 64, [`Max` 
15 
5 
20 
]); 
int015(5, 64, [`Fill (1 = fill, 0 = empty)` 
1 
1 
0 
]); 
SetStatus(0); 
int018; 

{Atom: Verdieping 1} 

int015(0, 64, [ 
1 
2 
3 
]); 
int015(1, 64, [`ActivityID` 
22 
23 
24 
]); 
int015(2, 64, [`vtp` 
166058172 
165557860 
155960564 
]); 
int015(3, 64, [`%` 
100 
100 
100 
]); 
int015(4, 64, [`Max` 
15 
20 
10 
]); 
int015(5, 64, [`Fill (1 = fill, 0 = empty)` 
0 
1 
1 
]); 
SetStatus(0); 
int018; 

样本输出

下面从读取Atom: Verdieping 2

Atom: Verdieping 2[1] = 4 
Atom: Verdieping 2[2] = 5 
Atom: Verdieping 2[3] = 6 

Atom: Verdieping 2[4] = 20 
Atom: Verdieping 2[5] = 21 
Atom: Verdieping 2[6] = 33 

Atom: Verdieping 2[7] = 139830296 
Atom: Verdieping 2[8] = 189540320 
Atom: Verdieping 2[9] = 169919424 

Atom: Verdieping 2[10] = 100 
Atom: Verdieping 2[11] = 100 
Atom: Verdieping 2[12] = 100 

Atom: Verdieping 2[13] = 15 
Atom: Verdieping 2[14] = 5 
Atom: Verdieping 2[15] = 20 

Atom: Verdieping 2[16] = 1 
Atom: Verdieping 2[17] = 1 
Atom: Verdieping 2[18] = 0 

返回下面的输出返回通过阅读Atom: Verdieping 1

Atom: Verdieping 1[1] = 1 
Atom: Verdieping 1[2] = 2 
Atom: Verdieping 1[3] = 3 

Atom: Verdieping 1[4] = 22 
Atom: Verdieping 1[5] = 23 
Atom: Verdieping 1[6] = 24 

Atom: Verdieping 1[7] = 166058172 
Atom: Verdieping 1[8] = 165557860 
Atom: Verdieping 1[9] = 155960564 

Atom: Verdieping 1[10] = 100 
Atom: Verdieping 1[11] = 100 
Atom: Verdieping 1[12] = 100 

Atom: Verdieping 1[13] = 15 
Atom: Verdieping 1[14] = 20 
Atom: Verdieping 1[15] = 10 

Atom: Verdieping 1[16] = 0 
Atom: Verdieping 1[17] = 1 
Atom: Verdieping 1[18] = 1 

注意:使用此方法,应用程序将只收集第一之间的信息即使你有两个同名的部分,它也会遇到。

谢谢,
我希望对您有所帮助:)