我有一个纺织品包含大量的数据,第一件事是我必须过滤叶细胞数据,这是分散在那里和here.For第一行我过滤行是开始于ADD GCELL
其中包含原始数据,接下来我要做的是我必须通过使用CELLID
来获取相同的文本文件中的相关数据进来相同的ADD GCELL
线。相关的数据来自ADD GTRX
开始的行和数据是FREQ , TRXNO , ISMAINBCCH ,
。简而言之,CELLID
是行ADD GCELL
和ADD 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文件中检索数据,它会改善性能吗?如果我在这里使用数据表和数据集而不是类,它会使性能得到改善吗?
这听起来像是正则表达式的工作。 –
我需要一个代码来获得剔除功能,我已经完成了部分编码,但需要完成它。目标是获得行ADD GOLD的所有值和ADD GTRX行的相应值 – peter
我一直在写40多个文本解析器如果没有看到完整的输入数据样本,您无法修复这些类型的问题。每个文本文件都完全不同,并且无需了解文本的完整结构就无法帮助您。见我的解析器之一在以下网页:http://stackoverflow.com/questions/30457660/parsing-multi-sections-of-a-text-file-using-regex-in-c-sharp/30458775#30458775 – jdweng