PDA

View Full Version : سوال: بدست آوردن مقادیر استرینگ از یک جمله و ریختن آن در لیست



ashkan1234
شنبه 10 آبان 1393, 14:32 عصر
سلام.
فرض کنید یه متن استرینگی به این صورت دارم (یا مثلا یک فایل تکست):
..........Status:Right Date:2014/01/01 Id:0111 Text:Barname \r\n Status:Left Date:2014/01/02 Id:0112 Text:Nevis \r\n
اون چند نقطه یعنی همینطور این روال ادامه داره،با ID های جدید!
حالا میخوام که مثلا کل مقادیر Status ها رو از این متن بگیرم مثلا اینجوری میشه:(سه نقطه یعنی تا ابد ادامه داره:لبخند:)

Right
Left
.
.
.
همچنین میخوام که مثلا کل مقادیر Date ها رو از این متن بگیرم مثلا اینجوری میشه:

2014/01/01
2014/01/02
.
.
.
و این روال برای تمامی مقادیر تا انتهای رشته ما ادامه داره!
با IndexOf و Split و ... نتونستم بدرستی اینکار رو انجام بده!
لطف میفرمایید چطوری میتونم اینو پیاده سازی کنم.
اینجور چیزها خوراک مستر خوخان هست!:لبخند::لبخند::لبخند::لبخ ند:
باتشکر:لبخند:

elec60
شنبه 10 آبان 1393, 14:47 عصر
با Split ميتوني درستش كني! Separator رو Space قرار بده و يه آرايه از string درست كن و براحتي كاري كه ميخواي انجام بده ديگه!

مثلا اگه بخواي Status ها رو بكشي بيرون از Linq استفاده كن و بعد از اينكه با متد Where مطلوب رو كشيدي بيرون قسمت :Status رو حذف كن و تو يه List اضافه كن...

pedram.11
شنبه 10 آبان 1393, 14:57 عصر
سلام
string[] getItems(string[] lines, string key)
{
key = key.ToLower();
List<string> items = new List<string>();
foreach (string line in lines)
{
string[] parts =line.Replace(" "," ").Split(' ');
foreach (string part in parts)
if (part.ToLower().StartsWith(key + ":")){
items.Add(part.Split(':')[1]);
break;
}
}
return items.ToArray();
}


string data = @"Status:Right Date:2014/01/01 Id:0111 Text:Barname
Status:Left Date:2014/01/02 Id:0112 Text:Nevis";
string[] lines = data.Replace("\r\n", "\n").Split('\n');
string[] status = getItems(lines, "status");

ashkan1234
شنبه 10 آبان 1393, 15:24 عصر
از دوستان سپاس گذارم!
منتهی یادم رفت این نکته رو عرض کنم که چرا با split نتونستم پیاده کنم!
بزرگترین مشکل اینجاست:Date به این شکله


2014/01/01 6:20:00 PM

و میخوام تاریخ رو جدا بگیرم و ساعت رو جدا!
و مشکل بعدی در قسمت Text ممکن است کاراکتر اسپیس یا کارکتر : وجود داشته باشد:مثلا اینطوری:

Text:My Name is:ashkan

این دو مورد برام مشکل سازن!
باتشکر از شما!:لبخند:

pedram.11
شنبه 10 آبان 1393, 20:12 عصر
این محدودیت هایی که گذاشتید خیلی مشکل ساز هست. در مورد اول که اگه مقدارتون اسپیس داشته باشه میشه کنار اومد. اما در مورد دوم که مقدار میتونه خود کاراکتر splitter رو هم داشته باشه مشکل ساز میشه. برای حل مشکل یا باید این کاراکتر رو در نظر نگیرید و یا اینکه تمام کلید هارو بعنوان کلید های از قبل تعیین شده ثبت کنید که برنامه این نام هارو بشناسه. اونوقت باز میشه یکارایی کرد

ashkan1234
شنبه 10 آبان 1393, 21:06 عصر
این محدودیت هایی که گذاشتید خیلی مشکل ساز هست. در مورد اول که اگه مقدارتون اسپیس داشته باشه میشه کنار اومد. اما در مورد دوم که مقدار میتونه خود کاراکتر splitter رو هم داشته باشه مشکل ساز میشه. برای حل مشکل یا باید این کاراکتر رو در نظر نگیرید و یا اینکه تمام کلید هارو بعنوان کلید های از قبل تعیین شده ثبت کنید که برنامه این نام هارو بشناسه. اونوقت باز میشه یکارایی کرد
خیلی متوجه راه حلتون نشدم!

pedram.11
شنبه 10 آبان 1393, 22:09 عصر
سلام. منظورم اینه که با این محدودیت ها باید کلید ها ثابت باشن. مثلا کدتون توی این مثالی که قرار دادید فقط باید دارای کد های status، id، date و text رو داشته باشه. برای این حالت من کدی نوشتم که امیدوارم نیازتون رو برآورده کنه:
enum itemType
{
status,
date,
id,
text
}
class item
{
public itemType type;
public string value;
}
class items : List<item>
{
public items() { }
public items(string line)
{
item itm;
string[] enums = Enum.GetNames(typeof(itemType));
foreach (string en in enums)
{
if (line.Length == 0)
return;
while (char.IsWhiteSpace(line[0]))
line = line.Remove(0, 1);
if (line.ToLower().StartsWith(en))
{
itm = new item();
itm.type = (itemType)Enum.Parse(typeof(itemType), en);
line = line.Remove(0, en.Length);
while (!char.IsLetterOrDigit(line[0]))
line = line.Remove(0, 1);
itm.value = "";
switch (itm.type)
{
case itemType.date:
int ind = line.ToLower().IndexOf("m");// am or pm
if (ind < 0)
{
ind = 0;
while (!char.IsWhiteSpace(line[ind]))
ind++;
ind--;
}
itm.value = line.Substring(0, ind + 1);
line = line.Remove(0, ind + 1);
break;
case itemType.id:
while (!char.IsDigit(line[0]))
line = line.Remove(0, 1);
while (char.IsDigit(line[0]))
{
itm.value += line[0].ToString();
line = line.Remove(0, 1);
}
break;
case itemType.status:
while (!char.IsWhiteSpace(line[0]))
{
itm.value += line[0].ToString();
line = line.Remove(0, 1);
}
break;
case itemType.text:
int ind1=-1, ind2=-1;
foreach (string en0 in enums)
{
if (ind1 < 0)
{
ind1 = line.ToLower().IndexOf(en0);
continue;
}
if ((ind2 = line.ToLower().IndexOf(en0)) > 0 && ind2 < ind1)
ind1 = ind2;
}
if (ind1 > 0)
itm.value = line.Substring(0, ind1);
else
itm.value = line;
break;
}
this.Add(itm);
}
}
}
}
class itemss : List<items>
{
public itemss() { }
public itemss(string[] lines)
{
foreach (string line in lines)
this.Add(new items(line));
}
public items this[itemType type]
{
get
{
items _itms = new items();
foreach (items itms in this)
{
foreach (item itm in itms)
{
if (itm.type == type)
{
_itms.Add(itm);
break;
}
}
}
return _itms;
}
}
}
public void Check()
{
string data = @"Status:Right Date:2014/01/01 6:20:00 PM Id:0111 Text:My Name is:ashkan
Status:Left Date:2014/01/02 Id:0112 Text:Nevis";
string[] lines = data.Replace("\r\n", "\n").Split('\n');
itemss _itemss = new itemss(lines);
items status = _itemss[itemType.status];
items dates = _itemss[itemType.date];
items ids = _itemss[itemType.id];
items texts = _itemss[itemType.text];
}

امیدوارم که محدودیتها بیشتر نشن همینطوریشم به زور کتک درست شده :لبخند: