تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] استفسار :- التاكد من وجود سطر جديد في الملف
#1
السلام عليكم ورحمة الله 

يسعد الله اوقاتكم 

عندي فكرة اريد تنفيذها نص الفكرة قمت بتنفيذها باقي النصف  الاخر 


وهيه عباره كود يقراء ملف معين text  مثلا

في حالت وجود سطر جديد يقوم بسحب البيانات لهذا السطر وتنزيله في قاعدة البيانات 

انا الكود اللي عني شغال بس في كل مرة يقراء الملف كامل واذا البيانات موجوده ما يقوم بتنزيلها واذا البيانات جديد يقوم بتنزيلها

بس اعتقد كذا مرهق على البرنامج في كل مرة يقراء الملف كامل

ما اعرف هل هناك طريقه ان يقراء اخر سطر فقط وينزل البيانات

اليكم الكود الخاص بي 

كود :
   Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Timer7.Interval = 3000
       Timer7.Start() 'Timer starts functioning

       cmdCheckCount.CommandText = String.Format("SELECT COUNT(CALLop) FROM DB{0} WHERE (CALLop = @CALLop) AND (DateNumber = @DateNumber) AND (time_on = @time_on)", strcallbk)
       cmdCheckCount.Parameters.Clear()
       cmdCheckCount.Parameters.Add("@CALLop", SqlDbType.VarChar)
       cmdCheckCount.Parameters.Add("@DateNumber", SqlDbType.VarChar)
       cmdCheckCount.Parameters.Add("@time_on", SqlDbType.VarChar)
       '============================================================
       cmdInsert.CommandText = String.Format("INSERT INTO DB{0} (CALLop,qso_date,timek,bands,modes,station_callsign,dxcc,cqz,ituz,rst_sent,rst_rcvd,country,LAT,LON,GRIDSQUARE,PFX,freq,DateNumber,time_on,operato,Continent) Values (@CALLop,@qso_date,@timek,@bands,@modes,@station_callsign,@dxcc,@cqz,@ituz,@rst_sent,@rst_rcvd,@country,@LAT,@LON,@GRIDSQUARE,@PFX,@freq,@DateNumber,@time_on,@operato,@Continent)", strcallbk)
       cmdInsert.Parameters.Clear()
       cmdInsert.Parameters.Add("@CALLop", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@qso_date", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@timek", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@bands", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@modes", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@station_callsign", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@dxcc", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@cqz", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@ituz", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@rst_sent", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@rst_rcvd", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@country", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@LAT", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@LON", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@GRIDSQUARE", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@PFX", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@freq", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@DateNumber", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@time_on", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@operato", SqlDbType.VarChar)
       cmdInsert.Parameters.Add("@Continent", SqlDbType.VarChar)
  End Sub


Private Sub Timer7_Tick(sender As Object, e As EventArgs) Handles Timer7.Tick


       Dim SavePathft8 As String = JT65PathX

       If File.Exists(SavePathft8) Then




           If File.ReadAllText(JT65PathX).Length = 0 Then



           Else

               txt = Computer.FileSystem.ReadAllText(JT65PathX)

               Dim Rgx As Regex = New Regex("<eor>")

               Dim Rgx2 As Regex = New Regex("<EOR>")





               If Rgx.IsMatch(txt) Then
                   ms = Strings.Split(txt, "" & "eor" & ">", -1, CompareMethod.Binary)
                   conXXCXX.Open()

                   Using transaction = conXXCXX.BeginTransaction()
                       cmdCheckCount.Transaction = transaction
                       cmdInsert.Transaction = transaction
                       For Each txtLine As String In ms
                           Call AddDataXFT8(iFT8)
                           iFT8 += 1
                       Next
                       transaction.Commit()
                   End Using


                   conXXCXX.Close()





               ElseIf Rgx2.IsMatch(txt) Then

                   ms = Strings.Split(txt, "" & "EOR" & ">", -1, CompareMethod.Binary)

                   conXXCXX.Open()


                   Using transaction = conXXCXX.BeginTransaction()
                       cmdCheckCount.Transaction = transaction
                       cmdInsert.Transaction = transaction
                       For Each txtLine As String In ms
                           Call AddDataXFT8(iFT8)
                           iFT8 += 1
                       Next
                       transaction.Commit()
                   End Using
                   conXXCXX.Close()

               End If
           End If
       End If


     
       'Timer7.Stop()
   End Sub




   Private Sub AddDataXFT8(ByVal i As Integer)
       On Error Resume Next
       Debug.Print(String.Format("{0} | Start Add :{1:mm:ssss}", i, Now))

       Dim colcall As String = Regex.Match(ms(i), "(?<=<call.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim qso_date As String = Regex.Match(ms(i), "(?<=<qso_date.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim coltime_on As String = Trim(Regex.Match(ms(i), "(?<=<time_on.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value)
       Dim colbands As String = Regex.Match(ms(i), "(?<=<band.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colmodes As String = Regex.Match(ms(i), "(?<=<mode.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colstation_callsign As String = Regex.Match(ms(i), "(?<=<station_callsign.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colfreq As String = Regex.Match(ms(i), "(?<=<freq.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colGRIDSQUARE As String = Regex.Match(ms(i), "(?<=<GRIDSQUARE.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colrst_sent As String = Regex.Match(ms(i), "(?<=<rst_sent.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim colrst_rcvd As String = Regex.Match(ms(i), "(?<=<rst_rcvd.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
       Dim operato As String = Regex.Match(ms(i), "(?<=<operator.+?>).+?(?=<)", RegexOptions.IgnoreCase Or RegexOptions.Singleline).Value
     
     

       Dim qsodate As String = qso_date.Trim()
       Dim d As Date = Date.ParseExact(qsodate, "yyyymmdd", System.Globalization.DateTimeFormatInfo.InvariantInfo)


       Dim bkd As String = d.ToString("yyyy/mm/dd", System.Globalization.CultureInfo.GetCultureInfo("en-US"))


       Dim coltimex As String = coltime_on.Trim()

       If Trim(coltimex.Length) = 4 Then

           timek = Regex.Replace(coltime_on, "(\d{2})(\d{2})", "$1:$2")

       ElseIf coltimex.Length = 6 Then


           timek = Regex.Replace(coltime_on, "(\d{2})(\d{2})(\d{2})", "$1:$2")
       ElseIf coltimex.Length = 7 Then

           timek = Regex.Replace(coltimex, Strings.Right(coltimex, 3), "")
       Else
           timek = Nothing
       End If



       If coltimex.Length = 6 Then


           timek1 = Regex.Replace(coltime_on, "(\d{2})(\d{2})(\d{2})", "$1$2")

       Else
           timek1 = Nothing
       End If


     



       colstation_callsign = strcallbk
       operato = strcallbk


       cmdCheckCount.Parameters("@CALLop").Value = colcall.Trim()
       cmdCheckCount.Parameters("@DateNumber").Value = qso_date.Trim()
       cmdCheckCount.Parameters("@time_on").Value = coltimex.Trim()
       If cmdCheckCount.ExecuteScalar = 0 Then
           cmdInsert.Parameters("@CALLop").Value = colcall.Trim()
           cmdInsert.Parameters("@qso_date").Value = bkd.Trim()
           cmdInsert.Parameters("@timek").Value = Trim(Convert.ToString(timek))
           cmdInsert.Parameters("@bands").Value = colbands.Trim()
           cmdInsert.Parameters("@modes").Value = colmodes.Trim()
           cmdInsert.Parameters("@station_callsign").Value = colstation_callsign.Trim()
           cmdInsert.Parameters("@dxcc").Value = bk9
           cmdInsert.Parameters("@cqz").Value = bk6
           cmdInsert.Parameters("@ituz").Value = bk7
           cmdInsert.Parameters("@rst_sent").Value = colrst_sent.Trim()
           cmdInsert.Parameters("@rst_rcvd").Value = colrst_rcvd.Trim()
           cmdInsert.Parameters("@country").Value = bk3
           cmdInsert.Parameters("@LAT").Value = bk4
           cmdInsert.Parameters("@LON").Value = bk5
           cmdInsert.Parameters("@GRIDSQUARE").Value = colGRIDSQUARE.Trim()
           cmdInsert.Parameters("@PFX").Value = bk2
           cmdInsert.Parameters("@freq").Value = colfreq.Trim()
           cmdInsert.Parameters("@DateNumber").Value = qso_date.Trim()
           cmdInsert.Parameters("@time_on").Value = coltimex.Trim()
           cmdInsert.Parameters("@operato").Value = operato.Trim()
           cmdInsert.Parameters("@Continent").Value = bk8

           cmdInsert.ExecuteNonQuery()
           Application.DoEvents()
 
       End If
   End Sub


في الحدث  Private Sub Timer7_Tick

كود :
Dim SavePathft8 As String = JT65PathX
هنا يتاكد من وجود الملف
JT65PathX

للعلم هذا الكود يقراء الملفات بصيغة 
adi


.txt   log.adi.txt (الحجم : 1,016 بايت / التحميلات : 9)

log.adi.txt

يرجى مسح .txt  لان المنتدى لا يدعم ملفات adi

المهم بعد التاكد من وجود الملف


كود :
If File.ReadAllText(JT65PathX).Length = 0 Then

يتاكد ان الملف في شي او فاضي
اذا في شي يبدى في العمل



الكود واضح بس سؤالي هل في طريقه لفكرة قراءة اخر سطر فقط 
للعلم الملف الثاني يتم تعبئته عن طريق برنامج اخر
log.adi

بارك الله فيكم واسف على الاطاله
الرد }}}
تم الشكر بواسطة:
#2
وعليكم السلام ورحمة الله وبركاتة

لا يمكن قراءة الملف بهذا الشكل.
أما تحميل كامل الملف والإلتفاف على كل سطر.
إما فتح StreamReader والبداء في قراءة سطر بسطر ويمكنك التوقف قبل الإنتهاء.

ولكن القفز مباشرتاً إلى آخر سطر ( غير ممكن ) لسبب وحيد هو عدم القدرة على معرفة طول كل سطر في الملف وهذا يجعل معرف السطر الأخير مستحيلة.
الرد }}}
تم الشكر بواسطة: dubai.eig , dubai.eig , elgokr
#3
(20-09-18, 01:51 PM)عبدالله الدوسري كتب : وعليكم السلام ورحمة الله وبركاتة

لا يمكن قراءة الملف بهذا الشكل.
أما تحميل كامل الملف والإلتفاف على كل سطر.
إما فتح StreamReader والبداء في قراءة سطر بسطر ويمكنك التوقف قبل الإنتهاء.

ولكن القفز مباشرتاً إلى آخر سطر ( غير ممكن ) لسبب وحيد هو عدم القدرة على معرفة طول كل سطر في الملف وهذا يجعل معرف السطر الأخير مستحيلة.

بارك الله فيك استاذي عبدالله

تسلم على الرد هو مجرد فكرة قلت يمكن في لها حركه  Rolleyes

على العموم شكرا لك بارك الله فيك وشكرا
الرد }}}
تم الشكر بواسطة: عبدالله الدوسري , elgokr
#4
لو كنت في نفس الحالة التي أنت بها الآن 

سأقوم بعمل برنامج صغير يعمل في الخلفية ( مهمتة الوحيدة هو التحقق من هذا الملف كل 20 ثانية مثلاً - أو 10 ثوان  )
أي معلومات جديدة تنقل لقاعدة البيانات ويتم يتفريغ الملف ( إذا كان بالإمكان وهو الأفضل )

أيضاً من الأفكار : إستخدام الكلاس ( FileSystemWatcher  )
هذا الكلاس يراقب حالة الملفات في مجلد معين أن تحددة , إذا حذث أي تغيير على الملف المستهدف مباشرتاً تبداء في عمل المطلوب. ( ولا تحتاج إلى عمل تايمر ليتحقق كل مدة من الزمن )


ملاحظة أخرى : قبل البداء في عمل نقل البيانات من الملف ( خذ نسخة من الملف - وإبداء العمل على الملف النسخة - وبعد الإنتهاء - تحقق من تطابق الملفين لأنه من الممكن أن تتم إضافة بيانات من البرنامج الآخر أثناء العملية )
وبذلك ستعرف انه تغير الملف قبل إنتهاء العملية ويمكنك التحقق من جديد عن أي بيانات جديدة - كل عملية تحقق تعني ملف نسخة جديدة
بعد الإنتهاء بالكامل إحذف الملف النسخة أو ( لا أعلم صراحة ما هي مجريات الأمور لديك ) أو قم بتفريغ الملف الأصلي إذا كان ممكن مع حذف النسخة
الرد }}}
تم الشكر بواسطة: dubai.eig , dubai.eig , elgokr
#5
(20-09-18, 03:42 PM)عبدالله الدوسري كتب : لو كنت في نفس الحالة التي أنت بها الآن 

سأقوم بعمل برنامج صغير يعمل في الخلفية ( مهمتة الوحيدة هو التحقق من هذا الملف كل 20 ثانية مثلاً - أو 10 ثوان  )
أي معلومات جديدة تنقل لقاعدة البيانات ويتم يتفريغ الملف ( إذا كان بالإمكان وهو الأفضل )

أيضاً من الأفكار : إستخدام الكلاس ( FileSystemWatcher  )
هذا الكلاس يراقب حالة الملفات في مجلد معين أن تحددة , إذا حذث أي تغيير على الملف المستهدف مباشرتاً تبداء في عمل المطلوب. ( ولا تحتاج إلى عمل تايمر ليتحقق كل مدة من الزمن )


ملاحظة أخرى : قبل البداء في عمل نقل البيانات من الملف ( خذ نسخة من الملف - وإبداء العمل على الملف النسخة - وبعد الإنتهاء - تحقق من تطابق الملفين لأنه من الممكن أن تتم إضافة بيانات من البرنامج الآخر أثناء العملية )
وبذلك ستعرف انه تغير الملف قبل إنتهاء العملية ويمكنك التحقق من جديد عن أي بيانات جديدة - كل عملية تحقق تعني ملف نسخة جديدة
بعد الإنتهاء بالكامل إحذف الملف النسخة أو ( لا أعلم صراحة ما هي مجريات الأمور لديك ) أو قم بتفريغ الملف الأصلي إذا كان ممكن مع حذف النسخة

اهلا استاذ عبدالله

تسلم على الملاحضات

انا فكرة انسخ المعلومات الي تنزل في المالف الرئيسي الى ملف اخر

ومن الملف الاخر اسحب للبرنامج الخاص بي ومن ثم امسح من الملف الاخر

الملف الرئيسي ما اقدر امسح من شي

وفكرة FileSystemWatcher    عجبتني 

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

وانا جالس اعمل بحث حاليا في قوقل 

ومنك نستفيد بارك الله فيك شكرا Rolleyes
الرد }}}
تم الشكر بواسطة: elgokr
#6
فكرتها بسيطة
مع العم قوقل اكيد راح تفهمها على طول.

اذا احتجت شيء اطرحة هنا.

سأذكر لك كيف استخدمت الكلاس FileSystemWatcher

كانت لدينا ماكينة تصوير وسكانر كبيرة ومتصلة بالشبكة.
ومن مميزاتها عمل سكان لوثائق كثيرة دفعة واحدة على هيئة ملفات PDF.
ويتم تحديد مجلد معين على الشبكة تقوم الماكينة بحفظ المفات به.
كل وثيقة تحتوي على اكثر من باركود في اماكن متعددة.
الفكرة مراقبة هذا المجلد واي وثيقة جديدة يتم تحليلها وقراءة باركود في منطقة معينة من الوثيقة.
بنائاً على رقم الباركود يتم نقل الوثيقة في قاعدة البيانات في السجل الخاص بها لأنها مرتبطة بسجلات برقم الباركود.
وبذلك، تم حل مشكلة وضع جهاز سكانر عند كل موظف.
الرد }}}
تم الشكر بواسطة: dubai.eig , dubai.eig , elgokr , elgokr
#7
(20-09-18, 01:32 PM)dubai.eig كتب : وهيه عباره كود يقراء ملف معين text  مثلا

في حالت وجود سطر جديد يقوم بسحب البيانات لهذا السطر وتنزيله في قاعدة البيانات 

من مطالعتى للملف 
كل عملية ادخال تتم فى سطر منفصل 
و بالتالى من الممكن أن تقوم بقراءة الملف كأسطر من البداية 

كود :
If File.ReadLines("").Count = 0 Then

أو 
كود :
If File.ReadAllLines("").Length = 0 Then

و تضع متغير لديك بالنموذج تحفظ به عدد الأسطر فى أخر عملية ادخال 
فاذا كان عدد الاسطر عند الفحص أكبر من عدد الاسطر فى اخر عمليه 
تقوم باضافة الاسطر الجديدة فقط ( الفرق بين القيمتين )



و بالتوفيق
الرد }}}
تم الشكر بواسطة: dubai.eig , dubai.eig , elgokr , elgokr



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم