23-06-17, 02:51 AM
الصفحات : 1 2
23-06-17, 04:04 AM
بسم الله وبحمده نبدأ في سرد فكرة البرنامج
الشطر الأول من البرنامج
الشطر الثاني من البرنامج
---- بعد الضغط على ايقونة مرجع التقسيم نرفع ملف وليكن اسمه مرجع التقسيم ويحتوي النسق الذي يتم من خلاله تقسيم الملف ALLWGS المرتب الى أجزاء كل جزء منها يحمل اسم على حسب ملف مرجع التقسيم
صورة توضح بعض الأجزاء من ملف التقسيم
ملاحظات
---- يتم تحديد الملفات الجزئية المراد استخراجها مثلا
--- الملف الرئيسي ALLWGS يحتوي على مقدمة ( header) ينبغي ان تكون في الملفات الجزئية بنفس الوضعية
---- كل جزء لم يكتمل عدد اسطره يتم استخراجه مع الإبلاغ عنه في نهاية العملية في تاكست بوكس
--- اود من الاخوة الكرام الاخذ بالاعتبار سرعة المعالجة واستخراج الملفات الجزئية
الملفات السالفة الذكر موجودة بملف مضغوط على الرابط ادناه
ملاحظة هامة بعد السرد الطويل احب ان انوه ان البرنامج يعمل عندي 100% ولم يتبقى سوء الجزئية المتعلقة ببوتون ايقاف BackgroundWorker
البرنامج مرفق
الشطر الأول من البرنامج
---- بعد الضغط على ايقونة ادراج نرفع ملف تاكست وليكن اسمه ALLWGS الذي يحتوي قائمة كبيرة من الاحداثيات تصل الى ما يعادل 000 150 سطر احداثيات يوجد نسخة منه بالمرفقات
--- بعد رفع الملف ALLWGS يقوم البرنامج بترتيب الاسطر بشكل تصاعدي وهذا على أساس الأربع ارقام في الكود كما هو مبين في الصورة كما يوجد نسخة للملف بعد الترتيب بالمرفقات
الشطر الثاني من البرنامج
---- بعد الضغط على ايقونة مرجع التقسيم نرفع ملف وليكن اسمه مرجع التقسيم ويحتوي النسق الذي يتم من خلاله تقسيم الملف ALLWGS المرتب الى أجزاء كل جزء منها يحمل اسم على حسب ملف مرجع التقسيم
صورة توضح بعض الأجزاء من ملف التقسيم
ملاحظات
---- يتم تحديد الملفات الجزئية المراد استخراجها مثلا
--- الملف الرئيسي ALLWGS يحتوي على مقدمة ( header) ينبغي ان تكون في الملفات الجزئية بنفس الوضعية
---- كل جزء لم يكتمل عدد اسطره يتم استخراجه مع الإبلاغ عنه في نهاية العملية في تاكست بوكس
--- اود من الاخوة الكرام الاخذ بالاعتبار سرعة المعالجة واستخراج الملفات الجزئية
الملفات السالفة الذكر موجودة بملف مضغوط على الرابط ادناه
ملاحظة هامة بعد السرد الطويل احب ان انوه ان البرنامج يعمل عندي 100% ولم يتبقى سوء الجزئية المتعلقة ببوتون ايقاف BackgroundWorker
البرنامج مرفق
23-06-17, 06:00 AM
لا يصح أن تقرأ الملف و تقوم بعمليات عليه في نفس الوقت
يجب قراءة الملف أولا بايتخدام RealdAllLines مثلا
ثم بعد ذلك ننعامل مع بيانات الملف كمصفوفات
دعني فقط أختبر المدة الزمنية المطلوبة لقراءة الملف كله دفعة واحدة و حاول انت أيضا أت تختبر المدة الزمنية بنفس الاسلوب
نصيحة بسيطة لك و أتمني أن تتقبلها بصدر رجب في المستقبل حاول ان توضح أسئلتك لأن السؤال الواضح بالتبعية يؤدي الي اجابة واضحة
سرال أخير هل بيانات الملف الأصلي الذي يمكن اعتباره علي انه Header File الخاص بمشروعك قد تتغير مستقبلا أم هي ثابتة
لأنه من اللمكن بناء الملف في ذاكرة الكبيوتر و القراءة من ذاكرة الكمبيوتر
والخلاصة هنا أنك مستقبلا تستطيع الاستغناء عن هذا الملف تماما
يجب قراءة الملف أولا بايتخدام RealdAllLines مثلا
ثم بعد ذلك ننعامل مع بيانات الملف كمصفوفات
دعني فقط أختبر المدة الزمنية المطلوبة لقراءة الملف كله دفعة واحدة و حاول انت أيضا أت تختبر المدة الزمنية بنفس الاسلوب
نصيحة بسيطة لك و أتمني أن تتقبلها بصدر رجب في المستقبل حاول ان توضح أسئلتك لأن السؤال الواضح بالتبعية يؤدي الي اجابة واضحة
سرال أخير هل بيانات الملف الأصلي الذي يمكن اعتباره علي انه Header File الخاص بمشروعك قد تتغير مستقبلا أم هي ثابتة
لأنه من اللمكن بناء الملف في ذاكرة الكبيوتر و القراءة من ذاكرة الكمبيوتر
والخلاصة هنا أنك مستقبلا تستطيع الاستغناء عن هذا الملف تماما
23-06-17, 06:23 AM
شكرا لك اخي silverlight على مجهودك الرائع معنا احب ان اوضع لك بعض النقاط
بخصوص قراءة الملف الاصلي كامل ومن ثم التعامل مع بياناتها اعتقد انه لاتصلح فيحالتي وهذا للسبب الذي تطرقت له وهو المدة المطلوبة لقراءة الملف دفعة واحد الملف كما يظهر لك كبير ويمكن ان يزيد على هذا العدد من الاسطر اعتقد ان الفكرة المطبقة في الكود بالقراءة و التقسيم في نفس الوقت هي الانسب
--- اما بخصوص Header File نعم هو متغير
الذي فهمته من ردك اخي ان ايقاف BackgroundWorker لا يصلح الا في حالة رفع الملف الاصلي كامل
بخصوص قراءة الملف الاصلي كامل ومن ثم التعامل مع بياناتها اعتقد انه لاتصلح فيحالتي وهذا للسبب الذي تطرقت له وهو المدة المطلوبة لقراءة الملف دفعة واحد الملف كما يظهر لك كبير ويمكن ان يزيد على هذا العدد من الاسطر اعتقد ان الفكرة المطبقة في الكود بالقراءة و التقسيم في نفس الوقت هي الانسب
--- اما بخصوص Header File نعم هو متغير
الذي فهمته من ردك اخي ان ايقاف BackgroundWorker لا يصلح الا في حالة رفع الملف الاصلي كامل
23-06-17, 07:14 AM
الملف الاصلي و هو ALLWGS
قرائته تستغرق من 40 - 70 مللي ثانية
لكي يتضح لك الأمر قليلا
افتح مشروع عادي و ضع الملف الرئيسي في فهرس المشروع
و اكتب الكود التالي
انا قرات الملف و قرأت Header لوحده و الارقام لوحدها
إنسي BackfroundWorker حاليا
دعنا نتحرك خطوة بخطوة
قرائته تستغرق من 40 - 70 مللي ثانية
لكي يتضح لك الأمر قليلا
افتح مشروع عادي و ضع الملف الرئيسي في فهرس المشروع
و اكتب الكود التالي
انا قرات الملف و قرأت Header لوحده و الارقام لوحدها
PHP كود :
Public Class Form1
Private timeToreadAllFile As String = ""
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim fpath As String = ".\ALLWGS.txt"
' توقيت لمعرفة المدة الزمنية لقراءة الملف كله
Dim sw As New Stopwatch
' تشغيل التايمر
sw.Start()
' قراءة الملف الرئيسي
Dim s = IO.File.ReadAllLines(fpath)
' إيقاف التايمر
sw.Stop()
' معرفة المدة الزمنية التي استغرقها قراءة الملف
timeToreadAllFile += sw.ElapsedMilliseconds.ToString
Dim i As Integer = Integer.Parse(timeToreadAllFile)
Me.Text = i.ToString
' مصفوفة رأس الملف فقط
Dim headeLines As String() = New String(6) {}
For i = 0 To 6
headeLines(i) = s(i)
Next
' مصفوفة الارقام فقط
Dim lines As List(Of String) = New List(Of String)
For j As Integer = headeLines.Length To s.Length - 1
lines.Add(s(j))
Next
End Sub
End Class
إنسي BackfroundWorker حاليا
دعنا نتحرك خطوة بخطوة
23-06-17, 09:17 AM
رائع اخي انا معك في الخطوة الاولى وهي مفهمومة بانتظار الخطوة الثانية
23-06-17, 09:41 AM
كود :
Imports System.Text.RegularExpressions
Imports System.ComponentModel
Public Class Form1
Dim WithEvents backwork As New BackgroundWorker With {.WorkerSupportsCancellation = True}
Dim Status As New StatusStrip
Dim StatusLabel = New ToolStripStatusLabel() With {.Text = "Ready."}
Dim StatusProgressBar As New ToolStripProgressBar() With {.Style = ProgressBarStyle.Marquee, .Visible = False, .MarqueeAnimationSpeed = 1}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
Me.Status.Items.Add(StatusProgressBar)
Me.Status.Items.Add(StatusLabel)
Me.Controls.Add(Status)
'----------------------
Me.TextBox1.ReadOnly = True
Me.TextBox2.ReadOnly = True
Me.Button3.Enabled = False
End Sub
Dim الملف_الرئيسي As String
Dim مرجع_التقسيم As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using o As New OpenFileDialog
o.Filter = "Text files (*.txt)|*.txt"
If o.ShowDialog = Windows.Forms.DialogResult.OK Then
الملف_الرئيسي = o.FileName
TextBox1.Text = IO.Path.GetFileName(o.FileName)
End If
End Using
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Using o As New OpenFileDialog
o.Filter = "Text files (*.txt)|*.txt"
If o.ShowDialog = Windows.Forms.DialogResult.OK Then
مرجع_التقسيم = o.FileName
TextBox2.Text = IO.Path.GetFileName(o.FileName)
Me.Button1.Enabled = False
Me.Button2.Enabled = False
Me.TextBox1.Enabled = False
Me.TextBox2.Enabled = False
Me.TextBox3.Enabled = False
Me.TextBox4.Enabled = False
Me.ListBox1.Items.Clear()
StatusProgressBar.Visible = True
backwork.RunWorkerAsync()
Me.Button3.Enabled = True
End If
End Using
End Sub
Private Sub backwork_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backwork.DoWork
Try
Dim sourceLines() As String = IO.File.ReadAllLines(الملف_الرئيسي)
' header ------------------------------
Me.StatusLabel.Text = "header working..."
Dim header(7 - 1) As String
Array.Copy(sourceLines, 0, header, 0, 7)
Me.StatusLabel.Text = "header completed"
' details -----------------------------
Me.StatusLabel.Text = "details working..."
Dim details(sourceLines.Count - 7 - 1) As String
Array.Copy(sourceLines, 7, details, 0, sourceLines.Count - 7)
For i = 0 To details.Length - 1
If backwork.CancellationPending Then
e.Cancel = True
Exit Sub
End If
details(i) = details(i).Substring(9, 4) & " - " & details(i)
Next
Array.Sort(details)
For i = 0 To details.Length - 1
If backwork.CancellationPending Then
e.Cancel = True
Exit Sub
End If
details(i) = details(i).Substring(7)
Next
Me.StatusLabel.Text = "header completed"
'splitfiles ---------------------------------------------
Dim files() As String = IO.File.ReadAllLines(مرجع_التقسيم)
For Each f As String In files
If backwork.CancellationPending Then
e.Cancel = True
Exit Sub
End If
If f.Trim <> "" Then
Dim filename As String = f.Substring(0, 8)
Me.StatusLabel.Text = filename & " working..."
Dim flagStart As Integer = Val(f.Substring(9, 4))
Dim flagEnd As Integer = Val(f.Substring(14, 4))
Dim flagCount As Integer = Val(f.Substring(19))
Dim range = Enumerable.Range(flagStart, flagEnd - flagStart + 1)
Dim RegexPattern As String = "^\w(\d{3})\s\d{4}(" & String.Join("|", range) & ")\s.+"
Dim ms As MatchCollection = Regex.Matches(String.Join(vbNewLine, details), RegexPattern, RegexOptions.Multiline)
Dim resultLines = (From x As Match In ms Select x.Value).ToArray
If flagCount <> ms.Count Then
ListBox1.Items.Add(filename)
End If
Dim resultFile As String = String.Empty
resultFile &= "date: xxxxxxxxx" & vbNewLine
resultFile &= "mois: xxxxxxxxxx " & vbNewLine
resultFile &= "project: xxxxxxxxx" & vbNewLine
resultFile &= "observation: xxxxxxxx" & vbNewLine
resultFile &= "unti: xxxxxxxxxxxxxxx" & vbNewLine
resultFile &= "" & vbNewLine
resultFile &= "" & vbNewLine
resultFile &= String.Join(vbNewLine, resultLines) & vbNewLine
IO.File.WriteAllText(filename & ".txt", resultFile)
Me.StatusLabel.Text = filename & " completed"
End If
Next
Catch ex As Exception
Me.StatusLabel.Text = "Error."
MsgBox(ex.Message)
End Try
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
If backwork.IsBusy Then backwork.CancelAsync()
Me.Button3.Enabled = False
End Sub
Private Sub backwork_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backwork.RunWorkerCompleted
If e.Cancelled Then
Me.StatusLabel.Text = "Cancelled."
Else
Me.StatusLabel.Text = "Successful."
End If
StatusProgressBar.Visible = False
Me.Button1.Enabled = True
Me.Button2.Enabled = True
Me.TextBox1.Enabled = True
Me.TextBox2.Enabled = True
Me.TextBox3.Enabled = True
Me.TextBox4.Enabled = True
Me.Button3.Enabled = False
End Sub
End Class23-06-17, 11:39 AM
شكرا لك اخي [b]WL_2000 جوابك كان فيه الحل دون ان استغني عن فكرة BackgroundWorker [/b]
[b]كم هو جميل ان تكون مشاركتك الاولى في المنتدى وبهذه الدقة في معالجة الاشكال [/b]
[b]كما ارحب بك في منتدنا الرائع والمميز بدلا عن الاخوة الاعضاء [/b]
[b]ام بخصوص فكرتك اخي [b][b]silverlight[/b] و التي بدات في طرحها و المتعلقة بقراءة الملف كامل فانا انتظر الجديد اذا رايت انه يوجد عندك وقت لاستكمالها فرغم ان الاشكال قد حل فانا هنا لاستفادة من جميع افكاركم والتعلم منها[/b][/b]
[b]كم هو جميل ان تكون مشاركتك الاولى في المنتدى وبهذه الدقة في معالجة الاشكال [/b]
[b]كما ارحب بك في منتدنا الرائع والمميز بدلا عن الاخوة الاعضاء [/b]
[b]ام بخصوص فكرتك اخي [b][b]silverlight[/b] و التي بدات في طرحها و المتعلقة بقراءة الملف كامل فانا انتظر الجديد اذا رايت انه يوجد عندك وقت لاستكمالها فرغم ان الاشكال قد حل فانا هنا لاستفادة من جميع افكاركم والتعلم منها[/b][/b]
الصفحات : 1 2