2015-05-29 114 views
0

我有一个纺织品包含大量的数据,第一件事是我必须过滤叶细胞数据,这是分散在那里和here.For第一行我过滤行是开始于ADD GCELL其中包含原始数据,接下来我要做的是我必须通过使用CELLID来获取相同的文本文件中的相关数据进来相同的ADD GCELL线。相关的数据来自ADD GTRX开始的行和数据是FREQ , TRXNO , ISMAINBCCH ,。简而言之,CELLID是行ADD GCELLADD GTRX的常见值。我已经在c#中完成了一些编码,但我被卡住了某处 这是文本文件 ........................... 的一部分。 ..........................如何从c#中的文本文件获取数据

ADD GCELL:CELLID=13, CELLNAME="NR_0702_07021_G1_A", MCC="424", MNC="02", LAC=6112, CI=7021, NCC=6, BCC=0, EXTTP=Normal_cell, IUOTP=Concentric_cell, ENIUO=ON, DBFREQBCCHIUO=Extra, FLEXMAIO=OFF, CSVSP=3, CSDSP=5, PSHPSP=4, PSLPSVP=6, BSPBCCHBLKS=1, BSPAGBLKSRES=4, BSPRACHBLKS=1, TYPE=GSM900_DCS1800, OPNAME="Tester", VIPCELL=NO 
.............................. 
ADD GTRX:TRXID=11140, TRXNAME="T_RAK_JaziratHamra_G_702_7021_A-0", FREQ=99, TRXNO=0, CELLID=13, IDTYPE=BYID, ISMAINBCCH=YES, ISTMPTRX=NO, GTRXGROUPID=80; 

代码,我所做的就是

using (StreamReader sr = File.OpenText(filename)) 
{ 
    while ((s = sr.ReadLine()) != null) 
    { 
     if (s.Contains("ADD GCELL:")) 
     { 
      s = s.Replace("ADD GCELL:", ""); 
      string[] items = s.Split(','); 
      foreach (string str in items) 
      { 
       string[] str1 = str.Split('='); 
       if (str1[0] == "CELLID") 
       { 
        cellidnew = str1[1]; 
       } 
       string fieldname = str1[0]; 
       string value = str1[1].Replace(";", string.Empty).Replace("\"", string.Empty); 

      } 

      Getgtrxvalues(filename, ref cellname, ref cellidnew, ref Frequency, ref TRXNO ,ref ISMAINBCCH); 


     } 
    } 
} 

private static void Getgtrxvalues(string filename, ref string cellname, ref string cellid, ref int Frequency, ref int TRXNO ,ref bool ISMAINBCCH) 
{ 
    using (StreamReader sr = File.OpenText(filename)) 
    { 
     while ((s = sr.ReadLine()) != null) 
     { 
      if (s.Contains("ADD GTRX:")) 
      { 
       try 
       { 


} 
} 
} 
} 

UPDATE

一切工作正常,除了一个更多的条件,我必须满足。在这里为ADD Gtrx:我将所有的价值包括Freq当ISMAINBCCH = YES,但同时ISMAINBCCH = NO有Freq值,我必须得到逗号分隔值。例如像这里首先,我将采取FREQ CELLID = 639(动态的任何事情可能发生)和ISMAINBCCH =是的,我现在已经完成了下一个任务是我必须以CELLID = 639和ISMAINBCCH = NO的逗号分隔方式来使用FREQ值,所以这里我想要的输出是24,28,67。如何实现这个

线

ADD GTRX:TRXID=0, TRXNAME="M_RAK_JeerExch_G_1879_18791_A-0", FREQ=81, TRXNO=0, CELLID=639, IDTYPE=BYID, ISMAINBCCH=YES, ISTMPTRX=NO, GTRXGROUPID=2556; 
ADD GTRX:TRXID=1, TRXNAME="M_RAK_JeerExch_G_1879_18791_A-1", FREQ=24, TRXNO=1, CELLID=639, IDTYPE=BYID, ISMAINBCCH=NO, ISTMPTRX=NO, GTRXGROUPID=2556; 
ADD GTRX:TRXID=5, TRXNAME="M_RAK_JeerExch_G_1879_18791_A-2", FREQ=28, TRXNO=2, CELLID=639, IDTYPE=BYID, ISMAINBCCH=NO, ISTMPTRX=NO, GTRXGROUPID=2556; 
ADD GTRX:TRXID=6, TRXNAME="M_RAK_JeerExch_G_1879_18791_A-3", FREQ=67, TRXNO=3, CELLID=639, IDTYPE=BYID, ISMAINBCCH=NO, ISTMPTRX=NO, GTRXGROUPID=2556; 

UPDATE

最后我做到了像如下所示代码

我创建了一个更多的属性DEFINED_TCH_FRQ = null获得连接字符串。但问题是它非常缓慢。我迭代文本文件两次,第一次是sr.readline(),第二个是获取连接字符串通过File.Readline(这ASLO先前我用File.Readalllines,拿出存储器异常)

List<int> intarr = new List<int>(); 
      intarr.Clear(); 
var gtrx = new Gtrx 
          { 
           CellId = int.Parse(PullValue(s, "CELLID")), 
           Freq = int.Parse(PullValue(s, "FREQ")), 
           TrxNo = int.Parse(PullValue(s, "TRXNO")), 
           IsMainBcch = PullValue(s, "ISMAINBCCH").ToUpper() == "YES", 
           Commabcch = new List<string> { PullValue(s, "ISMAINBCCH") }, 
           DEFINED_TCH_FRQ = null, 

           TrxName = PullValue(s, "TRXNAME"), 

          }; 

if (!intarr.Contains(gtrx.CellId)) 
          { 

           if (!_dictionary.ContainsKey(gtrx.CellId)) 
           { 
            // No GCell record for this id. Do something! 
            continue; 
           } 
           intarr.Add(gtrx.CellId); 
           string results = string.Empty; 

            var result = String.Join(",", 
     from ss in File.ReadLines(filename) 
     where ss.Contains("ADD GTRX:") 
     where int.Parse(PullValue(ss, "CELLID")) == gtrx.CellId 
     where PullValue(ss, "ISMAINBCCH").ToUpper() != "YES" 
     select int.Parse(PullValue(ss, "FREQ"))); 
            results = result; 


           var gtrxnew = new Gtrx 
           { 
            DEFINED_TCH_FRQ = results 
           }; 

           _dictionary[gtrx.CellId].Gtrx = gtrx; 

UPDATE

最后我没有像第一i-通过使用文件保存在一个数组起始ADD GTRX线.Readal然后使用该数组来获取连接字符串,而不是存储整个文本文件,并获得了一些性能改进。现在我的问题是,如果我将我的文本文件中每个都包含数十万行到xml,然后从xml文件中检索数据,它会改善性能吗?如果我在这里使用数据表和数据集而不是类,它会使性能得到改善吗?

+0

这听起来像是正则表达式的工作。 –

+0

我需要一个代码来获得剔除功能,我已经完成了部分编码,但需要完成它。目标是获得行ADD GOLD的所有值和ADD GTRX行的相应值 – peter

+0

我一直在写40多个文本解析器如果没有看到完整的输入数据样本,您无法修复这些类型的问题。每个文本文件都完全不同,并且无需了解文本的完整结构就无法帮助您。见我的解析器之一在以下网页:http://stackoverflow.com/questions/30457660/parsing-multi-sections-of-a-text-file-using-regex-in-c-sharp/30458775#30458775 – jdweng

回答

2

假设数据是一致的,我也假定GCells会在GTrx行之前(因为GTrx引用GCell的id),那么你可以创建一个简单的解析器来做到这一点,并将值存储在字典。

首先要做的就是创建一个类来保存Gtrx数据和GCell数据。请记住,我只是抓住了一部分数据。如果你需要更多的字段可以添加到这个:

private class Gtrx 
{ 
    public int Freq { get; set; } 
    public int TrxNo { get; set; } 
    public string TrxName { get; set; } 
    public int CellId { get; set; } 
    public bool IsMainBcch { get; set; } 
} 

private class Gcell 
{ 
    public int CellId { get; set; } 
    public string CellName { get; set; } 
    public string Mcc { get; set; } 
    public int Lac { get; set; } 
    public int Ci { get; set; } 
} 

除了这些课程,我们还需要一个类来“链接”这两个类一起:

private class GcellGtrx 
{ 
    public Gcell Gcell { get; set; } 
    public Gtrx Gtrx { get; set; } 
} 

现在我们可以建立一个简单的解析器:

private readonly Dictionary<int, GcellGtrx> _dictionary = new Dictionary<int, GcellGtrx>(); 

string data = "ADD GCELL:CELLID=13, CELLNAME=\"NR_0702_07021_G1_A\", MCC=\"424\", MNC=\"02\", LAC=6112, CI=7021, NCC=6, BCC=0, EXTTP=Normal_cell, IUOTP=Concentric_cell, ENIUO=ON, DBFREQBCCHIUO=Extra, FLEXMAIO=OFF, CSVSP=3, CSDSP=5, PSHPSP=4, PSLPSVP=6, BSPBCCHBLKS=1, BSPAGBLKSRES=4, BSPRACHBLKS=1, TYPE=GSM900_DCS1800, OPNAME=\"Tester\", VIPCELL=NO" + Environment.NewLine; 
data = data + "ADD GTRX:TRXID=11140, TRXNAME=\"T_RAK_JaziratHamra_G_702_7021_A-0\", FREQ=99, TRXNO=0, CELLID=13, IDTYPE=BYID, ISMAINBCCH=YES, ISTMPTRX=NO, GTRXGROUPID=80;" + Environment.NewLine; 

using (var sr = new StringReader(data)) 
{ 
    string line = sr.ReadLine(); 
    while (line != null) 
    { 
     line = line.Trim(); 
     if (line.StartsWith("ADD GCELL:")) 
     { 
      var gcell = new Gcell 
      { 
       CellId = int.Parse(PullValue(line, "CELLID")), 
       CellName = PullValue(line, "CELLNAME"), 
       Ci = int.Parse(PullValue(line, "CI")), 
       Lac = int.Parse(PullValue(line, "LAC")), 
       Mcc = PullValue(line, "MCC") 
      }; 
      var gcellGtrx = new GcellGtrx(); 
      gcellGtrx.Gcell = gcell; 
      _dictionary.Add(gcell.CellId, gcellGtrx); 
     } 
     if (line.StartsWith("ADD GTRX:")) 
     { 
      var gtrx = new Gtrx 
      { 
       CellId = int.Parse(PullValue(line, "CELLID")), 
       Freq = int.Parse(PullValue(line, "FREQ")), 
       TrxNo = int.Parse(PullValue(line, "TRXNO")), 
       IsMainBcch = PullValue(line, "ISMAINBCCH").ToUpper() == "YES", 
       TrxName = PullValue(line, "TRXNAME") 
      }; 

      if (!_dictionary.ContainsKey(gtrx.CellId)) 
      { 
       // No GCell record for this id. Do something! 
       continue; 
      } 
      _dictionary[gtrx.CellId].Gtrx = gtrx; 
     } 
     line = sr.ReadLine(); 
    } 
} 

// Now you can pull your data using a CellId: 
// GcellGtrx cell13 = _dictionary[13]; 
// 
// Or you could iterate through each one: 
// foreach (KeyValuePair<int, GcellGtrx> kvp in _dictionary) 
// { 
//  int key = kvp.Key; 
//  GcellGtrx gCellGtrxdata = kvp.Value; 
//  // Do Stuff 
// } 

最后,我们需要定义一个简单的辅助方法:

private string PullValue(string line, string key) 
{ 
    key = key + "="; 
    int ndx = line.IndexOf(key, 0, StringComparison.InvariantCultureIgnoreCase); 
    if (ndx >= 0) 
    { 
     int ndx2 = line.IndexOf(",", ndx, StringComparison.InvariantCultureIgnoreCase); 
     if (ndx2 == -1) 
      ndx2 = line.Length - 1; 
     return line.Substring(ndx + key.Length, ndx2 - ndx - key.Length).Trim('"').Trim(); 
    } 

    return ""; 
} 

应该这样做!看看这不适合你。请记住,这是非常基本的。你可能想要处理一些可能的错误(如不存在的关键等)。

+0

获得相应的值,也许看起来我们是如何发送多个车型在MVC使用视图模型,两个阶级,一个超集CLAS – peter

+1

呀,个人,对我来说,我喜欢一切都打包成一个类来查看。它使我更容易使用程序。 – Icemanind

+1

@peter - 添加一个例子,你的问题 – Icemanind

0

没有指定究竟是哪里错了,但我的猜测是,你所遇到的问题是你的分裂造成的:

string[] str1 = str.Split('='); 

这种分裂会导致你的字符串是“CELLID”和“ 13“(来自您的文件示例)。注意“CELLID”前面的空格。这会导致下面的代码永远不会传递:

if (str1[0] == "CELLID") 

你可以将其更改为:

if (str1[0].Trim() == "CELLID") 

它可能工作。

+0

我已经为我完成了,我需要一个代码来获得剔除功能,我已经完成了部分编码,但需要完成它。目标是从行ADD GCELL获取所有值,并从ADD GTRX行 – peter