منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : اريد تقسيم عناصر listbox إلي ملفات txt داخل الجهاز
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته 

انا لدي listbox1 يوجد به مليون بروكسي مثلا . او مليون عنصر . 
اريد ان احفظها علي الجهاز بصيغه txt 
ولكن يتم تقسيم المليون بروكسي او المليون عنصر علي 49 ملف 
كيف يمكنني فِعل ذلك ؟ 

اتمني الاجابة السريعة للضرورة

يتم تقسيمها علي 49 ملف بمعني انو يحفظهم 49 ملف text بدل ملف واحد
يقسم المجموع بتاعهم علي ال 49 ويحفظهوملي بالترتيب 1,2,3,4,5,6,7,8,9,10,11,............... 49
فينكم يا شباب . Sad
تفضل اخي الكريم :

كود :
       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
(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  كما هو موضح في الصورة .. 

وعليكم السلام ورحمة الله وبركاته

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 1
                If c 
ListBox1.Items.Count Then Exit For
 
           Next
            IO
.File.WriteAllText("bah" "i.txt"s.ToString)
 
       Next 
(03-09-20, 09:05 PM)bazooka top كتب : [ -> ]السلام عليكم ورحمة الله وبركاته 
اهلا بك اخي الكريم . 
انت لم تفهمني جيدا . 

بل فهمتك جيدا الحمد لله 

الكود تحدد فيه اقصى عدد تريده في كل ملف وليكن 20000 مثلا او 40000 كما تريد

ومن ثم يقوم بحفظ عناصر الليست بوكس في ملف كل ملف لايزيد عن العدد المحدد

لايقص اي شيء يحفظ العناصر كلها في ملفات بارقام

جرب الكود واخبرني بالنتيجة
(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 1
                If c 
ListBox1.Items.Count Then Exit For
 
           Next
            IO
.File.WriteAllText("bah" "i.txt"s.ToString)
 
       Next 

سأجربه ولي عودة شكرا لك

(03-09-20, 10:16 PM)Anas Mahmoud كتب : [ -> ]
(03-09-20, 09:05 PM)bazooka top كتب : [ -> ]السلام عليكم ورحمة الله وبركاته 
اهلا بك اخي الكريم . 
انت لم تفهمني جيدا . 

بل فهمتك جيدا الحمد لله 

الكود تحدد فيه اقصى عدد تريده في كل ملف وليكن 20000 مثلا او 40000 كما تريد

ومن ثم يقوم بحفظ عناصر الليست بوكس في ملف كل ملف لايزيد عن العدد المحدد

لايقص اي شيء يحفظ العناصر كلها في ملفات بارقام

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


جربت الكود . يحفظ ملف واحد فقط فيه 20000 والباقي مش موجودين
(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()

            sw.WriteLine(ListBox1.Items(a), True)
            Try
                ProgressBar1.Value += 1

            Catch ex As Exception

            End Try
        Next
       
        sw.Close()
        If max < (ListBox1.Items.Count - 1) Then
            min = max
            WriteProxies(min)

        End If


    End Sub
اخي بازوكا أسف على الرد الاول كان خاطىء
واعذرني لاني بصراحة كذا مرة اشوف السؤال هذا في المنتدى او سؤال قريب منه واحس انه بسيط لكن بااتضح انه على الاقل يبغى زيادة تركيز

لكن الحمد لله رجعت دققت في سؤالك وحاولت اغير طريقتي للحل
وان شاء الله يكون هذا  الحل هو اللي ماتسأل بعده

تفضل الكود:


كود :
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*

        MaxLinesInFile = Math.Floor((ListBox1.Items.Count) / numberofFiles)


        '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\//\/\/\/\\//\
        'هذا المتغير ضروري لانه يخبرنا ان عدد العناصر التي لم تكتب اصبح اقل من عدد الاسطر
        'لانه قيمته هي نفس عدد الاسطر لاخر ملف في حال كان اخر ملف يجب ان يحتوي على اسطر اقل من مما قبله
        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


لكن رجاء تخبرني اذا كان الحل صحيح او كان خاطىء
تحياتي
لا اعلم اخي تفاصيل برنامجك ولكنها عملت معي في مثال بسيط 

[attachment=25582]

[attachment=25583]