PDA

View Full Version : مشکلی در خواندن سطر خاص از فایل متنی



samiasoft
سه شنبه 30 آبان 1396, 21:40 عصر
سلام دوستان

من این مشکل رو نتونستم با جستجو حل کنم برا همین مجبور به ایجاد تاپیک شدم.

فرض کنید یه فایل متنی داریم با محتویات زیر :






[Ripage]
0=Ripage1;1
1=Ripage2;1
[Courbes]
16=8.00;0
0=Ripage3;1
1=Ripage4;1



میخواستم مقدار Ripage1 و Ripage2 رو استخراج کنم...برای همین دستور زیر رو نوشتم :




TReader = new StreamReader(OpenFileDialog1.FileName);
FileName = OpenFileDialog1.FileName;
strLine = TReader.ReadLine();


while (!(strLine == null))
{

if (strLine.Contains("0=") )
{

string[] Ripage1 = strLine.Split('=');


textBox4.Text = Ripage1[1].Replace(";1", "");


}

if (strLine.StartsWith("1=") )
{
string[] Ripage2 = strLine.Split('=');


textBox5.Text = Ripage2[1].Replace(";1", "");


}
}

TReader.Close();
TReader = null;







اما خب طبیعیه که مقدار Ripage3 و Ripage4 رو خواهد داد...چگونه این دستورات رو ویرایش کنم تا مقدار Ripage1 و Ripage2 رو به ما بده؟(نمیخوام از regex استفاده کنم...چون کل پروژه با همین دستورات نوشته شده )

ممنون میشوم راهنمایی کنید

mr.sirwan
سه شنبه 30 آبان 1396, 22:39 عصر
سلام، قبل از هر چیز آیا محتویات این فایل تغییر خواهد کرد یا خیر؟ یعنی بعدا سطرهای دیگه ای هم بهش اضافه میشن یا فقط همین 7 سطر هستش؟ و ایا شما در اینده هم فقط به محتویات بخش [Ripage] نیاز خواهید داشت؟؟

samiasoft
سه شنبه 30 آبان 1396, 22:54 عصر
سلام، قبل از هر چیز آیا محتویات این فایل تغییر خواهد کرد یا خیر؟ یعنی بعدا سطرهای دیگه ای هم بهش اضافه میشن یا فقط همین 7 سطر هستش؟ و ایا شما در اینده هم فقط به محتویات بخش [Ripage] نیاز خواهید داشت؟؟
جز اون سطرهای دیگرم هست.....و بقیه سطرها مقادیر
Ripage1 و Ripage2 و Ripage3 و Ripage4 و...دارند که تغییر میکند

من بقیه سطرها رو تونستم دربیارم فقط چون 0= و 1= چندبار در بخش های دیگر هم تکرار شده برای همین در بخش
[Ripage] نتونستم مقدارشو بدست بیارم

mr.sirwan
سه شنبه 30 آبان 1396, 23:19 عصر
این فایلتون از نوع INI هستش؟ برای فایل های ini یک dll هستش که به راحتی این مقادیر رو براتون برمیگردونه، دقیق یادم نیس اسم dll چی بود، من یه جستجویی توی فایل هام میکنم و بهتون خبر میدم

samiasoft
سه شنبه 30 آبان 1396, 23:27 عصر
این فایلتون از نوع INI هستش؟ برای فایل های ini یک dll هستش که به راحتی این مقادیر رو براتون برمیگردونه، دقیق یادم نیس اسم dll چی بود، من یه جستجویی توی فایل هام میکنم و بهتون خبر میدم
اره یه فایل ini هستش..:متفکر:ینی نمیشه با کدنویسی ساده اینو استخراج کرد؟

مثلا بیاییم شماره سطری که کلمه [Ripage] وجود داره رو پیدا کنیم بعد شماره سطر بعدیشو بخونیم تا مقدار رو بدست بیاوریم...ولی نمیدونم چطوری بنویسم کدشو

mr.sirwan
سه شنبه 30 آبان 1396, 23:57 عصر
این کد رو همین الان تو محیط کنسول نوشتم، دیگه زحمت تبدیل و جایگذاری Console ها به textbox به عهده خودتون:

string section = "[Ripage]";
bool isFound = false;
while (strLine != null)
{
if (strLine.StartsWith("[") && strLine.EndsWith("]"))
{
isFound = strLine == section;
}
else
{
if (isFound)
{
if (strLine.Contains("0="))
{
string[] Ripage1 = strLine.Split('=');
Console.WriteLine(Ripage1[1].Replace(";1", ""));
}

if (strLine.StartsWith("1="))
{
string[] Ripage2 = strLine.Split('=');
Console.WriteLine(Ripage2[1].Replace(";1", ""));
}
}
}

strLine = reader.ReadLine();
}

samiasoft
چهارشنبه 01 آذر 1396, 03:03 صبح
این کد رو همین الان تو محیط کنسول نوشتم، دیگه زحمت تبدیل و جایگذاری Console ها به textbox به عهده خودتون:

string section = "[Ripage]";
bool isFound = false;
while (strLine != null)
{
if (strLine.StartsWith("[") && strLine.EndsWith("]"))
{
isFound = strLine == section;
}
else
{
if (isFound)
{
if (strLine.Contains("0="))
{
string[] Ripage1 = strLine.Split('=');
Console.WriteLine(Ripage1[1].Replace(";1", ""));
}

if (strLine.StartsWith("1="))
{
string[] Ripage2 = strLine.Split('=');
Console.WriteLine(Ripage2[1].Replace(";1", ""));
}
}
}

strLine = reader.ReadLine();
}



متشکرم از شما...به هدفم رسیدم:لبخندساده:

فقط در مورد اون کتابخانه ای هم که اشاره کردید در صورتی که پیدا کردید ممنون میشم قرار بدید.

shahryari
چهارشنبه 01 آذر 1396, 09:56 صبح
سلام
کلاس INIAccess
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
class INIAccess
{
[DllImport("kernel32.dll")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
public void INIWrite(string INIPath, string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, INIPath);
}
public string INIRead(string INIPath, string Section, string Key, string DefualtValue = "")
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, DefualtValue, temp, 255, INIPath);
return temp.ToString();
}
}

samiasoft
چهارشنبه 01 آذر 1396, 17:28 عصر
سلام
کلاس INIAccess

ممنون بابت قرار دادن این کلاس

اما درصورت امکان یک نمونه مثالی برای کار کردن با این کلاس دارید؟

shahryari
چهارشنبه 01 آذر 1396, 18:10 عصر
سلام
اینجا (http://www.w3-farsi.com/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7%DB%8C-ini-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/)توضیح دادم