从文本文件中获取特定信息

时间:2013-08-16 13:13:33

标签: c# regex

我有一个~7mb文本文件,我想从中提取一些信息,它包含许多类似格式的实例:

            "name": "Riki's Dagger",
            "defindex": 0,
            "item_class": "dota_item_wearable",
            "item_type_name": "#DOTA_WearableType_Daggers",
            "item_name": "#DOTA_Item_Rikis_Dagger",
            "proper_name": false,
            "item_quality": 0,
            "image_inventory": null,
            "min_ilevel": 1,
            "max_ilevel": 1,
            "image_url": "",
            "image_url_large": "",

我想提取名称和defindex,检查此实例是否包含某些关键字,然后将其放在新的文本文件中,以便我以后可以使用它。 我的计划是在文件中搜索“name”(带引号)的每个实例,并将“name”的下一个实例之前的所有内容设置为名为current的变量。然后从那里搜索当前字符串以获取我需要的信息。这是最好的方式,我将如何去做?我应该使用正则表达式还是文件太大?一些方向将非常感激。

这是我到目前为止所做的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;

namespace ConsoleApplication1
{
    class Test
    {
        static void Main(string[] args)
            {
            string ingameschemaFilePath = @"C:\Users\Andrew\Documents\GitHub\SteamBot\Bin\Debug\ingameschema.txt";
            string dota2schemaFilePath = @"C:\Users\Andrew\Documents\GitHub\SteamBot\Bin\Debug\dota2schema.txt";
            string schemaFilePath = @"C:\Users\Andrew\Documents\GitHub\SteamBot\Bin\Debug\schema.txt";

            string[] ingameschema = File.ReadAllLines(ingameschemaFilePath);
            string[] dota2schema = File.ReadAllLines(dota2schemaFilePath);
            string[] current = null;
            string[] name = null;
            string[] defindex = null;
            string[] rarity = null;

            using (TextWriter textWriter = new StreamWriter(schemaFilePath))
            {
                foreach (//search for "name"->"name" segment here)
                {
                    //    if current.Contains("dota_item_wearable") == false, current.Contains("announcer", "courier", "ward", "egg", "costume", "HUD", "smeevil", "taunt", "bait", "lure", "bundle" ) == true, 
                    //          break
                    }
                }
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
    }
    }
}

2 个答案:

答案 0 :(得分:0)

我认为您应该使用StreamReader逐行读取文本文件,然后在该行中找到所需的信息。

如果您在完成阅读之前存储了部分文件,那么只会出现问题,那么您可能会遇到内存问题(但是您会惊讶地发现,列表和词典会在您之前获得多大的内容内存耗尽)

您需要做的是尽快保存已处理的数据,而不是将其保留在内存中(或尽可能保留在内存中)。

答案 1 :(得分:0)

您可能考虑的一种方法是将源代码放入某种基于字典的集合中,然后您可以通过您对该项目感兴趣的密钥进行寻址。

实施例

    static void Main(string[] args)
    {
        string sourcefile = @"C:\test\source.txt";
        string outputfile = @"C:\test\output.txt";

        string[] source = File.ReadAllLines(sourcefile);

        // The list would represent the collection of all the items 
        List<NameValueCollection> list = new List<NameValueCollection>();

        // Each nvc would represent the collection of attributes for that item
        NameValueCollection nvc = null;

        foreach (string s in source)
        {
            //Split your string into its key and value
            string[] nv = s.Split(':');

            //If the key is name you have finished your previous item, and will it to the list and start a new one
            if (nv[0] == "name")
            {
                if (nvc != null)
                    list.Add(nvc);

                nvc = new NameValueCollection();
            }
            // Add your attribute and value to the items attribute collection
            nvc.Add(nv[0], nv[1]);
        } 
    }

7mb有点大,但今天的记忆你应该没事。如果它成为问题,您可以考虑使用Stream对象中的ReadLine,而不是将每行加载到内存中。

让我知道这是否有帮助。