2013-04-25 117 views
0

块我需要帮助解析此示例文本:需要帮助解析文本

[item1] 
2550 coins 995 200000 7  
2550 coins 995 200000 7  
2550 coins 995 200000 7 
2550 coins 995 200000 7 
2550 coins 995 200000 7 
[/item1] 
[item2] 
2550 coins 995 200000 7  
2550 coins 995 200000 7 
2550 coins 995 200000 7 
2550 coins 995 200000  
2550 coins 995 200000 7  
[/item2]  
[item3]  
2550 coins 995 200000 7  
2550 coins 995 200000 7  
2550 coins 995 200000 7  
2550 coins 995 200000 7  
2550 coins 995 200000 7  
[/item3] 

我不知道如何同时保持航向的项目从每个项目中读取数据(ITEM1等)的数据相关联。我很抱歉,但我不知道如何解决这个问题,到目前为止,这是我解析一个没有标题的项目。

private void button1_Click(object sender, EventArgs e) 
    { 
     //dataGridView1.Rows.Add("Ashes", "d", "a", "g"); 
     //dataGridView1.Rows[0].Cells[3].Style.BackColor = Color.Aqua; 
     String fileName = "Drops.de"; 
     StreamReader streamReader = new StreamReader(fileName); 
     int[] nums = new int[4]; 

     int npcID; 
     int itemID; 
     int itemAmount; 
     int itemRarity; 
     string itemName; 

     // string currentLine = streamReader.ReadLine(); 

     while (!streamReader.EndOfStream) 
     { 
      string currentLine = streamReader.ReadLine(); 


      if (!currentLine.Contains('#') && currentLine != "" && !currentLine.Contains("[")) 
      {  
       String[] s = currentLine.Split(' '); 
       npcID = int.Parse(s[0]); 
       itemName = (s[1]); 
       itemID = int.Parse(s[2]); 
       itemAmount = int.Parse(s[3]); 
       itemRarity = int.Parse(s[4]); 
       dataGridView1.Rows.Add(itemName, itemID, itemAmount, itemRarity); 
       dataGridView1.Refresh(); 
      } 
      else 
      { 
       streamReader.ReadLine(); 
      } 

     } 

     streamReader.Close(); 

    } 

任何和所有帮助将不胜感激:)

+0

你期待什么样的输出? – 2013-04-25 04:19:39

+0

我目前正在输出它作为一个项目的每一组数据。因此,如果可能的话,可以将来自每个项目的数据存储到可以在DataGridvView中显示的表格中。我甚至不确定是否有可能。 – 2013-04-25 04:22:46

回答

0

这并不需要u的阅读它的ITEM2的情况下第二次了什么在这里

else 
{ 
    streamReader.ReadLine(); 
} 

- >> itemRarity = int.Parse(s [4]);第四条记录你可能会得到异常索引out bound array at itemRarity = int.Parse(s [4]);

原因是没有第五元素

你能做的最好的是,如果条件

if(Regex.match(currentline,@"^\d+\s\w+\s\d+\s\d+\s\d+\s*?$")) 
{ 
    #now do your logic here 
} 

下面是完整的代码:

private void button1_Click(object sender, EventArgs e) 
    { 
     String fileName = "d:\\Drops.txt"; 
     StreamReader streamReader = new StreamReader(fileName); 
     dataGridView1.Rows.Clear(); 
     dataGridView1.Columns.Clear(); 
     dataGridView1.Columns.Add("Head","Head"); 
     dataGridView1.Columns.Add("npcID", "npcID"); 
     dataGridView1.Columns.Add("itemName", "itemName"); 
     dataGridView1.Columns.Add("itemID", "itemID"); 
     dataGridView1.Columns.Add("itemAmount", "itemAmount"); 
     dataGridView1.Columns.Add("itemRarity", "itemRarity"); 

     string itemhead = "Not Found"; 
     while (!streamReader.EndOfStream) 
     { 
      string currentLine = streamReader.ReadLine(); 

      if (Regex.IsMatch(currentLine, @"^\d+\s\w+\s\d+\s\d+\s\d+?\s*?$")) 
      { 
       List<string> s = new List<string>(); 
       s.Add(itemhead); 
       s.AddRange(currentLine.Split(' ')); 

       dataGridView1.Rows.Add(s.ToArray()); 
       dataGridView1.Refresh(); 
      } 
      else if(Regex.IsMatch(currentLine,@"\[[^/]*\]")) 
      { 
       itemhead = Regex.Match(currentLine, @"\[([^/]*)\]").Groups[0].Value; 
      } 


     } 

     streamReader.Close(); 
    } 
0

您已经阅读线分支用[item]标识符...用它读取关于该项目的所需信息...将该信息存储在循环之外的变量中...每次读取没有[item] id的行时entifyer,你仍然可以使用该变量来知道这条线属于哪个项目...

string headingItem="unknown Item"; 
    while (!streamReader.EndOfStream) 
    { 
     string currentLine = streamReader.ReadLine(); 

     if (!currentLine.Contains('#') && currentLine != "" && !currentLine.Contains("[")) 
     {  
      String[] s = currentLine.Split(' '); 
      npcID = int.Parse(s[0]); 
      itemName = (s[1]); 
      itemID = int.Parse(s[2]); 
      itemAmount = int.Parse(s[3]); 
      itemRarity = int.Parse(s[4]); 
      dataGridView1.Rows.Add(headingItem, itemName, itemID, itemAmount, itemRarity); 
      dataGridView1.Refresh(); 
     } 
     else 
     { 
      headingItem=currentLine; 
     } 

    }