03-09-20, 12:14 PM (آخر تعديل لهذه المشاركة : 03-09-20, 12:16 PM {2} بواسطة bazooka top.)
السلام عليكم ورحمة الله وبركاته
انا لدي listbox1 يوجد به مليون بروكسي مثلا . او مليون عنصر .
اريد ان احفظها علي الجهاز بصيغه txt
ولكن يتم تقسيم المليون بروكسي او المليون عنصر علي 49 ملف
كيف يمكنني فِعل ذلك ؟
اتمني الاجابة السريعة للضرورة
يتم تقسيمها علي 49 ملف بمعني انو يحفظهم 49 ملف text بدل ملف واحد
يقسم المجموع بتاعهم علي ال 49 ويحفظهوملي بالترتيب 1,2,3,4,5,6,7,8,9,10,11,............... 49
Dim LinesPerFile = 20000 'اقصي عدد عناصر لكل ملف
Dim Lines = ListBox1.Items.Count 'عدد العناصر الكلي
Dim Files = Math.Ceiling(Lines / LinesPerFile) 'عدد الملفات
For FileID As Integer = 0 To Files - 1
Dim FileName = String.Format("E:\{0}.txt", FileID)
Using sw As New StreamWriter(File.Open(FileName, FileMode.OpenOrCreate))
Dim startIndex = FileID * LinesPerFile 'اول عنصر في الملف الحالي
Dim endIndex = Math.Min(startIndex + LinesPerFile, Lines) - 1 'اخر عنصر في الملف الحالي
For index = startIndex To endIndex
sw.WriteLine(ListBox1.Items(index).ToString)
Next
(03-09-20, 07:46 PM)Anas Mahmoud كتب : تفضل اخي الكريم :
كود :
Dim LinesPerFile = 20000 'اقصي عدد عناصر لكل ملف
Dim Lines = ListBox1.Items.Count 'عدد العناصر الكلي
Dim Files = Math.Ceiling(Lines / LinesPerFile) 'عدد الملفات
For FileID As Integer = 0 To Files - 1
Dim FileName = String.Format("E:\{0}.txt", FileID)
Using sw As New StreamWriter(File.Open(FileName, FileMode.OpenOrCreate))
Dim startIndex = FileID * LinesPerFile 'اول عنصر في الملف الحالي
Dim endIndex = Math.Min(startIndex + LinesPerFile, Lines) - 1 'اخر عنصر في الملف الحالي
For index = startIndex To endIndex
sw.WriteLine(ListBox1.Items(index).ToString)
Next
End Using
Next
السلام عليكم ورحمة الله وبركاته
اهلا بك اخي الكريم .
انت لم تفهمني جيدا .
انا اريد تقسيم عدد الاسطر الموجودة في listbox , ايا كان عددها لا يحذف منها
وعند حفظ الملف يقوم بحفظ 48 ملف
المهم في الاخر لما يعمل save للـ txt يقسمهم في 48 تكست مش واحد بس . لان الملفات التي اعمل عليها كبيرة جدا .. تحتوي علي زيادة عن 2 مليون او مليون سطر .. في listbox بالتالي انا اريد تقسيم العدد علي 48 txt كما هو موضح في الصورة ..
Dim filecount = Math.Ceiling(ListBox1.Items.Count / 48) Dim c As Integer = 0 For i = 1 To 48 Dim s As New System.Text.StringBuilder For i2 = 1 To filecount s.AppendLine(ListBox1.Items(c)) c = c + 1 If c = ListBox1.Items.Count Then Exit For Next IO.File.WriteAllText("bah" & i & "i.txt", s.ToString) Next
04-09-20, 12:05 AM (آخر تعديل لهذه المشاركة : 04-09-20, 12:06 AM {2} بواسطة bazooka top.)
(03-09-20, 10:02 PM)L35 كتب : وعليكم السلام ورحمة الله وبركاته
PHP كود :
Dim filecount = Math.Ceiling(ListBox1.Items.Count / 48) Dim c As Integer = 0 For i = 1 To 48 Dim s As New System.Text.StringBuilder For i2 = 1 To filecount s.AppendLine(ListBox1.Items(c)) c = c + 1 If c = ListBox1.Items.Count Then Exit For Next IO.File.WriteAllText("bah" & i & "i.txt", s.ToString) Next
سأجربه ولي عودة شكرا لك
(03-09-20, 10:16 PM)Anas Mahmoud كتب :
(03-09-20, 09:05 PM)bazooka top كتب : السلام عليكم ورحمة الله وبركاته
اهلا بك اخي الكريم .
انت لم تفهمني جيدا .
بل فهمتك جيدا الحمد لله
الكود تحدد فيه اقصى عدد تريده في كل ملف وليكن 20000 مثلا او 40000 كما تريد
ومن ثم يقوم بحفظ عناصر الليست بوكس في ملف كل ملف لايزيد عن العدد المحدد
لايقص اي شيء يحفظ العناصر كلها في ملفات بارقام
جرب الكود واخبرني بالنتيجة
جربت الكود . يحفظ ملف واحد فقط فيه 20000 والباقي مش موجودين
04-09-20, 11:03 AM (آخر تعديل لهذه المشاركة : 04-09-20, 11:10 AM {2} بواسطة معاند الحظ.)
(03-09-20, 12:14 PM)bazooka top كتب : السلام عليكم ورحمة الله وبركاته
انا لدي listbox1 يوجد به مليون بروكسي مثلا . او مليون عنصر .
اريد ان احفظها علي الجهاز بصيغه txt
ولكن يتم تقسيم المليون بروكسي او المليون عنصر علي 49 ملف
كيف يمكنني فِعل ذلك ؟
اتمني الاجابة السريعة للضرورة
يتم تقسيمها علي 49 ملف بمعني انو يحفظهم 49 ملف text بدل ملف واحد
يقسم المجموع بتاعهم علي ال 49 ويحفظهوملي بالترتيب 1,2,3,4,5,6,7,8,9,10,11,............... 49
وعليك السلام ورحمة الله وبركاته
مادام تقول ان لديك مليون عنصر في ليست بوكس عبارة عن عناوين بروكسي
ومادام ان المطلوب هو تقسيم المليون بروكسي الى 49 مجموعة وهذا يعني ان في كل مجموعة يوجد 20408 عنصر وكسور
وكل مجموعة تحفظ في ملف نصي في المسار اللي تحدده
بحسب مافهمت انا جربت التالي
وضعت داخل الليست بوكس 1000 عنصر تبدأ من 0
ثم قمت بحفظ كل 50 عنصر في ملف على اعتبار انك تقصد بالرقم 49 تسعه واربعين عنصر
وكانت النتيجة انشاء 21 ملف كل ملف يحتوي 50 بروكسي الا الاخير يحتوي اقل من 50 بحكم الضرورة
وتاكدت من الحل بمطابقة اخر عنصر في اخر ملف مع اخر عنصر في الليست بوكس
كود :
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
WriteProxies(0)
End Sub
Sub WriteProxies(min As Integer)
Static counter As Integer
ProgressBar1.Maximum = ListBox1.Items.Count
Dim fname As String = "D:\test\proxy"
Dim sw As IO.StreamWriter
sw = New IO.StreamWriter(fname & counter & ".txt")
counter += 1
Static max As Integer
Dim lastValidMax As Integer = (ListBox1.Items.Count - 1) - 49
If (min + 49) < (lastValidMax + 49) Then
max = min + 49
Else
max = lastValidMax + 49 ' (ListBox1.Items.Count - 1)
End If
For a As Integer = min To max
Application.DoEvents()
04-09-20, 08:08 PM (آخر تعديل لهذه المشاركة : 04-09-20, 10:06 PM {2} بواسطة معاند الحظ.)
اخي بازوكا أسف على الرد الاول كان خاطىء
واعذرني لاني بصراحة كذا مرة اشوف السؤال هذا في المنتدى او سؤال قريب منه واحس انه بسيط لكن بااتضح انه على الاقل يبغى زيادة تركيز
لكن الحمد لله رجعت دققت في سؤالك وحاولت اغير طريقتي للحل
وان شاء الله يكون هذا الحل هو اللي ماتسأل بعده
تفضل الكود:
كود :
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
WriteProxies(0)
End Sub
Sub WriteProxies(firstLine As Integer)
Static counter As Integer = 1
ProgressBar1.Maximum = ListBox1.Items.Count
Dim fname As String = "D:\test\proxy"
Dim sw As IO.StreamWriter
sw = New IO.StreamWriter(fname & counter & ".txt", False)
Dim numberofFiles As Integer = 49
Dim MaxLinesInFile As Integer
'*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x**x*x*x*x*x
' for loop التحقق من عدد العناصر قبل بدء
If ListBox1.Items.Count < numberofFiles Then
MsgBox("خطأ،عدد العناصر اقل من عدد الملفات")
Exit Sub
End If
'x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*
'/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\//\/\/\/\\//\
'هذا المتغير ضروري لانه يخبرنا ان عدد العناصر التي لم تكتب اصبح اقل من عدد الاسطر
'لانه قيمته هي نفس عدد الاسطر لاخر ملف في حال كان اخر ملف يجب ان يحتوي على اسطر اقل من مما قبله
Dim diff As Integer = (ListBox1.Items.Count) - (MaxLinesInFile * numberofFiles)
'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'هنا نتأكد في كل مره ان عدد العناصر التي لم تحفظ
'اكبر او اقل من عدد الاسطر المطلوبه لكل ملف
'فان كان عدد العناصر اقل من عدد الاسطر
' firstline+ diff قيمة MaxLinesInFile نعطي المتغير
'
If firstLine + diff = ListBox1.Items.Count Then
MaxLinesInFile = firstLine + diff
Else
MaxLinesInFile = firstLine + MaxLinesInFile
End If
Static i As Integer = 1
For a As Integer = firstLine To MaxLinesInFile
Application.DoEvents()
sw.WriteLine(ListBox1.Items(a), False)
ListBox1.SelectedIndex = a
Try
ProgressBar1.Value += 1
Catch ex As Exception
End Try
If a = (ListBox1.Items.Count - 1) Then
sw.Flush()
sw.Close()
counter = 0
i = 1
ProgressBar1.Value = 0
MaxLinesInFile = 0
firstLine = 0
Exit Sub
End If
Next
sw.Close()
If counter < numberofFiles Then
counter += 1
End If
WriteProxies(MaxLinesInFile)
End Sub
لكن رجاء تخبرني اذا كان الحل صحيح او كان خاطىء
تحياتي