تمت الإجابة ما هي افضل طريقة للتعامل مع الملفات النصية او xml بطريقة خاصة؟

تم تحميل الصفحة في 0,4641395 ثانية
ما هي افضل طريقة للتعامل مع الملفات النصية او xml بطريقة خاصة؟
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
السلام عليكم
دلوقتي عندي مشروع فيه 3 فورم وملف نصي بجانب البرنامج فيه هذا القيم
=========
Login=دخول
User Name=اسم المستخدم
Exit=خروج
=========
وبستدعي قيم نصية لكل فورم

مثلا الفورم الاول بستدعي القيمة Login=دخول
والفورم الثاني Exit=خروج
والثالث User Name=اسم المستخدم

بس لما بستدعي الفورم الثالث
بيفضل يدور علي القيمة الخاصة بيه في الملف النصي لحد ما يلاقيها

بيبحث عن قيمة User Name

والملف النصي فيه ما يقارب 500 سطر
يعني لو القيمة User Name هي رقم 500
يبقا هيفضل يبحث بعض الوقت لحد ما يوصل للقيمة

لذا اريد مساعدتكم في تطوير الفكرة
طرأ فبالي فكرة وهي
تقسيم القيم داخل الملف النصي
بمعني
هذه هي قيم الملف النصي
=========
Login=دخول
User Name=اسم المستخدم
Exit=خروج
=========
تمام ؟
فكرت بتقسيمهم علي هذا النحو مثلا
=========
{form1}
Login=دخول
{form1}
{form3}
User Name=اسم المستخدم
{form3}
{form2}
Exit=خروج
{form2}
=========
وعند البحث يقوم بالبحث عن الفورم اولا
مثلا لو الفورم 3
يبقا يجيب
{form3}
User Name=اسم المستخدم
{form3}
من الملف ويبحث فيهم
افضل واسرع من انه يبحث في كل الملف
هذا ما خطر ببالي
فكيف وايه افضل طريقة لتنفيذ عملية البحث والتقسيم هذه
وهل لديك اراء افضل من واسرع من ذلك؟
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt")

        Dim D As String() = (From L As String In T Select L Where L = "UserName").ToArray

        If D.Length > 0 Then

            MsgBox(D(0))

        End If
 
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt")

        Dim D As String() = (From L As String In T Select L Where L = "UserName").ToArray

        If D.Length > 0 Then

            MsgBox(D(0))

        End If
هذا اسرع
ولا InStr اسرع؟
انا ابحث عن افضل واسرع اداء لهذه العملية

وما رايك بفكرة التقسيم داخل الملف هل سيكون اسرع
وملف نصي اسرع ولا xml
مثال
C#:
Dim xmldoc As New XmlDocument

        Dim xmlnode As XmlNodeList

        Dim i As Integer

        Dim str As String

        Dim fs As New FileStream("products.xml", FileMode.Open, FileAccess.Read)

        xmldoc.Load(fs)

        xmlnode = xmldoc.GetElementsByTagName("Product")

        For i = 0 To xmlnode.Count - 1

            xmlnode(i).ChildNodes.Item(0).InnerText.Trim()

            str = xmlnode(i).ChildNodes.Item(0).InnerText.Trim() & "  " & xmlnode(i).ChildNodes.Item(1).InnerText.Trim() & "  " & xmlnode(i).ChildNodes.Item(2).InnerText.Trim()

            MsgBox(str)

        Next
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
طريقتك كويسة
لكن ال For ليش ؟

اذا البيانات راح تكون بشكل هاذا وبدون for راح يكون اسرع بأنك تتحق من Product0 او Product1


كود:
<Products>
    <Product0>
        <name>xxx</name>
        <Id>0</Id>
   </Product0>
       <Product1>
        <name>bbb</name>
        <Id>1</Id>
   </Product1>
</Products>
اذا تحتاج السرعة لازم تبعد عن اي حلقة تكرار

جرب اختبر السرعة بين الكودين


كود:
        Dim start As System.DateTime = System.DateTime.Now()


        ' الكود الي تحب تختبر سرعته


        Dim span As System.TimeSpan = System.DateTime.Now() - start
        MsgBox(span.Milliseconds) ' الوقت الضائع
 
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt")

        Dim D As String() = (From L As String In T Select L Where L = "UserName").ToArray

        If D.Length > 0 Then

            MsgBox(D(0))

        End If
ممتاز جدا الله ينور عليك
هذا الكود نفذ العملية في 171
والكود الي كنت بستخدمه من 4 شهور نفذها في 591
ممكن الفرق ده يكون عادي بالنسبة لبعض المبرمجين

ولكن انا بحاجة للسرعة وافضل اداء خصوصا انى اعمل علي مشروع كبير ما يقارب من 69 فورم
وبستخدم هذا الكود عند فتح كل فورم
لذا سيفرق كثيرا
_________
فالبداية مكنتش بهتم بصراحة سوي بنجاح عمل الكود
لكن الان ابحث فقط عن افضل اداء واقل اكواد لتنفيذ المطلوب بشكل جيد
مجرد فضول
ماذا لو قسمت الملف النصي الي هذا الشكل
<Products>
<Product0>
<name>xxx</name>
<Id>0</Id>
</Product0>
<Product1>
<name>bbb</name>
<Id>1</Id>
</Product1>
</Products>
كيف سيكون هذا الكود
(From L As String In T Select L Where L = "UserName").ToArray
ليتعامل مع الملف المقسم
وكيف هيتم تحديث البحث فقط في Product
سواء كان Product0
او Product0
.....
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
ممتاز جدا الله ينور عليك
هذا الكود نفذ العملية في 171
والكود الي كنت بستخدمه من 4 شهور نفذها في 591
ممكن الفرق ده يكون عادي بالنسبة لبعض المبرمجين

ولكن انا بحاجة للسرعة وافضل اداء خصوصا انى اعمل علي مشروع كبير ما يقارب من 69 فورم
وبستخدم هذا الكود عند فتح كل فورم
لذا سيفرق كثيرا
_________
فالبداية مكنتش بهتم بصراحة سوي بنجاح عمل الكود
لكن الان ابحث فقط عن افضل اداء واقل اكواد لتنفيذ المطلوب بشكل جيد
مجرد فضول
ماذا لو قسمت الملف النصي الي هذا الشكل
<Products>
<Product0>
<name>xxx</name>
<Id>0</Id>
</Product0>
<Product1>
<name>bbb</name>
<Id>1</Id>
</Product1>
</Products>
كيف سيكون هذا الكود
(From L As String In T Select L Where L = "UserName").ToArray
ليتعامل مع الملف المقسم
وكيف هيتم تحديث البحث فقط في Product
سواء كان Product0
او Product0
.....
ماتحتاج تستخدم ... Select Where

تقدر تحدد على القيمة بهاذي الطريقة

كود:
        Dim start As System.DateTime = System.DateTime.Now()

        Dim fs As New FileStream("x.xml", FileMode.Open, FileAccess.Read)

        Dim xmldoc As New XmlDocument

        xmldoc.Load(fs) ' من الأفضل انك ماتحمل الملف كل ماتفتح فورم جديد لانه راح يستهلك بعض الوقت + الذاكرة

        Dim ReadNode As XmlNode = xmldoc.DocumentElement.SelectSingleNode("/mRoot/Form[@Name='Form1']/Login/@value") ' راح يتم تحديد قيمة الدخول من الفورم 1

        Dim span As System.TimeSpan = System.DateTime.Now() - start
        MsgBox(span.Milliseconds & " ms") ' الوقت الضائع

        If ReadNode Is Nothing Then
            '>>> لآشي
        Else

            MsgBox(ReadNode.InnerText)

        End If

        fs.Close() ' <<<

x.xml

XML:
<mRoot>

  <Form Name="Form1">
      <Login value="L444"/>
    <UserName value="U555"/>
    <Exit value="E666"/>
  </Form>

    <Form Name="Form2">
      <Login value="L111"/>
    <UserName value="U222"/>
    <Exit value="E333"/>
  </Form>

</mRoot>
 
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
ماتحتاج تستخدم ... Select Where

تقدر تحدد على القيمة بهاذي الطريقة

كود:
        Dim start As System.DateTime = System.DateTime.Now()

        Dim fs As New FileStream("x.xml", FileMode.Open, FileAccess.Read)

        Dim xmldoc As New XmlDocument

        xmldoc.Load(fs) ' من الأفضل انك ماتحمل الملف كل ماتفتح فورم جديد لانه راح يستهلك بعض الوقت + الذاكرة

        Dim ReadNode As XmlNode = xmldoc.DocumentElement.SelectSingleNode("/mRoot/Form[@Name='Form1']/Login/@value") ' راح يتم تحديد قيمة الدخول من الفورم 1

        Dim span As System.TimeSpan = System.DateTime.Now() - start
        MsgBox(span.Milliseconds & " ms") ' الوقت الضائع

        If ReadNode Is Nothing Then
            '>>> لآشي
        Else

            MsgBox(ReadNode.InnerText)

        End If

        fs.Close() ' <<<

x.xml

XML:
<mRoot>

  <Form Name="Form1">
      <Login value="L444"/>
    <UserName value="U555"/>
    <Exit value="E666"/>
  </Form>

    <Form Name="Form2">
      <Login value="L111"/>
    <UserName value="U222"/>
    <Exit value="E333"/>
  </Form>

</mRoot>
ممتاز اخي الله ينور عليك
قررت استخدام ملف نصي بدلا من xml
اخر استفسار
هل يمكن تقسيم الملف النصي
واستخدام هذا الكود معه
Dim T As String() = IO.File.ReadAllLines("x.txt")

Dim D As String() = (From L As String In T Select L Where L = "UserName").ToArray

If D.Length > 0 Then

MsgBox(D(0))

End If

وكيف سيكون ذلك بهذا الكود مع ملف نصي مقسم
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
ممتاز اخي الله ينور عليك
قررت استخدام ملف نصي بدلا من xml
اخر استفسار
هل يمكن تقسيم الملف النصي
واستخدام هذا الكود معه
Dim T As String() = IO.File.ReadAllLines("x.txt")

Dim D As String() = (From L As String In T Select L Where L = "UserName").ToArray

If D.Length > 0 Then

MsgBox(D(0))

End If

وكيف سيكون ذلك بهذا الكود مع ملف نصي مقسم

انت بتقسم السطر نفسه ولا اكثر من سطر

ممكن توضح لي البيانات كيف راح تكون و وين القيمة الي بتعتمد عليها بالتقسيم داخل الملف



لن ReadAllLines راح تقرا الملف سطر سطر

و From L As String In T Select L Where L راح تحدد السطر الي تحتاجه بتقسم بنفس السطر ؟
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt") ' UserName|FormName
        Dim S As String() = {"|"}
        Dim D As String() = (From L As String In T Select L Where L.Split(S, StringSplitOptions.RemoveEmptyEntries).GetValue(0) = "UserName").ToArray 'FormName <GetValue(1)
        Dim K As String() = If(D.Length > 0, D(0).Split(S, StringSplitOptions.RemoveEmptyEntries), Nothing)
        If K IsNot Nothing Then
            MsgBox(K(0)) '<UserName
            MsgBox(K(1)) '<FormName
        End If
 
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
انت بتقسم السطر نفسه ولا اكثر من سطر

ممكن توضح لي البيانات كيف راح تكون و وين القيمة الي بتعتمد عليها بالتقسيم داخل الملف



لن ReadAllLines راح تقرا الملف سطر سطر

و From L As String In T Select L Where L راح تحدد السطر الي تحتاجه بتقسم بنفس السطر ؟
C#:
#form1#
Login=دخول
User Name=اسم المستخدم
Exit=خروج
Password=كلمة المرور
#form1#
#form2#
Login=x11
User Name=x22
Exit=خروج
Password=x33
#form2#
 

QS7S

مُميّز نُقطة لُغات البرمجة للعام 2019
rankrank
إنضم
28 يناير 2019
المشاركات
292
الإعجابات
357
النقاط
63
C#:
#form1#
Login=دخول
User Name=اسم المستخدم
Exit=خروج
Password=كلمة المرور
#form1#
#form2#
Login=x11
User Name=x22
Exit=خروج
Password=x33
#form2#

كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt", System.Text.Encoding.Default)
        Dim D As String() = S(T, "#form1#")
        MsgBox(D(0)) 'Login
        MsgBox(D(1)) 'UserName
        MsgBox(D(2)) 'Exit
        MsgBox(D(3)) 'Password
كود:
    Private Function S(T As String(), V As String) As String()
        Dim I As Integer() = {Array.IndexOf(T, V), Array.LastIndexOf(T, V)}
        Dim D(I(1) - I(0) - 2) As String
        Array.Copy(T, I(0) + 1, D, 0, I(1) - I(0) - 1)
        Return D.Clone()
    End Function
 
إنضم
8 يناير 2015
المشاركات
2,325
الإعجابات
1,801
النقاط
113
العمر
22
الإقامة
مصر ( ام الدنيا )
كود:
        Dim T As String() = IO.File.ReadAllLines("x.txt", System.Text.Encoding.Default)
        Dim D As String() = S(T, "#form1#")
        MsgBox(D(0)) 'Login
        MsgBox(D(1)) 'UserName
        MsgBox(D(2)) 'Exit
        MsgBox(D(3)) 'Password
كود:
    Private Function S(T As String(), V As String) As String()
        Dim I As Integer() = {Array.IndexOf(T, V), Array.LastIndexOf(T, V)}
        Dim D(I(1) - I(0) - 2) As String
        Array.Copy(T, I(0) + 1, D, 0, I(1) - I(0) - 1)
        Return D.Clone()
    End Function
تمام
شكرا جزيلا
باذن الله هجربه لما انزل اجازة من الجيش بعد 20 يوم :270:
 
الإعجابات: QS7S

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل