需要帮助解析文本块

时间:2013-04-25 04:14:50

标签: c# regex file parsing block

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

[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();

    }

非常感谢任何和所有帮助:)

2 个答案:

答案 0 :(得分:0)

这不要求你第二次读错了

else
{
     streamReader.ReadLine();
}

在item2的情况下 - >>第4条记录你可能得到异常索引输出绑定数组 在          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();
    }

答案 1 :(得分:0)

你已经有一个分支用于读取[item]标识符的行...用它来读取有关该项目的所需信息...将该信息存储在循环外的变量中...每次你读取一个没有[item]标识符的行,您仍然可以使用该变量来了解此行所属的项目...

    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;
        }

    }