Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 20
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Làm thế nào lấy ngẫu nhiên một số dòng trong file text...?

    Tình hình là đang làm 1 project về rút trích ngẫu nhiên 1 số dòng dữ liệu trong file text (.txt) theo 1 tỷ lệ cho trước..Giả sử như mình đang có 1 file text với 100 dòng, yêu cầu là lấy ngẫu nhiên ra 75 dòng (không phải là lấy tuần tự từ trên xuống dưới mà lấy bất kỳ)...Sau khi phân chia dữ liệu xong thì ghi tất cả những dữ liệu đó vào 1 file text khác. Mình đang phân vân không biết làm sao, mong mọi người hướng dẫn giùm cho mình...Cấu trúc hàm như sau:

    public void SeparateData(FileInfo source, FileInfo target, double percent)
    trong đó source là file dữ liệu nguồn
    target là file dữ liệu đích
    percent là tỷ lệ chia dữ liệu (0->1)

    Mình là newbie nên kiến thức về C# còn rất hạn chế...xin mọi người chỉ giáo thêm!!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích xuất ngẫu nhiên thì
    - Đọc hết nội dung của tập tin rồi lưu nó trong một trường nào đó.
    - Số dòng của tập tin có thể tính trong khi đọc hoặc sau khi đọc xong dùng phương thức string.Split() để đếm được số dòng.
    - Dựa vào % để lấy được số lượng dòng cần trích xuất.
    - Dùng phương thức Math.Random() để lấy số dòng ngẫu nhiên. Và cứ lặp cho đến khi xong.
    - Nhưng trong quá trình lấy dòng ngẫu nhiên có thể xảy ra trùng nhau, nên có biện pháp ngăn chặn.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi SITUVNX
    Trích xuất ngẫu nhiên thì
    - Đọc hết nội dung của tập tin rồi lưu nó trong một trường nào đó.
    - Số dòng của tập tin có thể tính trong khi đọc hoặc sau khi đọc xong dùng phương thức string.Split() để đếm được số dòng.
    - Dựa vào % để lấy được số lượng dòng cần trích xuất.
    - Dùng phương thức Math.Random() để lấy số dòng ngẫu nhiên. Và cứ lặp cho đến khi xong.
    - Nhưng trong quá trình lấy dòng ngẫu nhiên có thể xảy ra trùng nhau, nên có biện pháp ngăn chặn.
    bạn có thể minh họa bằng code cho mình hiểu được không...3 ý đầu của bạn thì mình hiểu..nhưng mà 2 ý sau thì mình chưa hình dung ra..mình sắp tới hạn nộp project rồi..

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Minh họa 1 phát thì xem như là viết cho bạn rồi =))

    Mà bạn lấy ngẫu nhiên thì liệu có lộn xộn các dòng không hay là vẫn thứ tự trước sau với tập tin gốc?
    VD:
    Mã:
    1. Tôi là SITUVN.
    2. Có cái gì đó rất rất...
    3. Xin chào!
    4. Tạm biệt!
    5. Việt Nam tôi yêu!
    6. Ngày mai tôi đi phỏng vấn.
    7. Khóc nữa đi thằng khốn!
    8. CongDongCViet.com
    Lấy 50% ngẫu nhiên nó sẽ lấy ngẫu nhiên được các dòng: 5 8 3 1
    Vậy nó sẽ giữ nguyên hay sắp xếp lại theo: 1 3 5 8

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi SITUVNX
    Minh họa 1 phát thì xem như là viết cho bạn rồi =))

    Mà bạn lấy ngẫu nhiên thì liệu có lộn xộn các dòng không hay là vẫn thứ tự trước sau với tập tin gốc?
    VD:
    Mã:
    1. Tôi là SITUVN.
    2. Có cái gì đó rất rất...
    3. Xin chào!
    4. Tạm biệt!
    5. Việt Nam tôi yêu!
    6. Ngày mai tôi đi phỏng vấn.
    7. Khóc nữa đi thằng khốn!
    8. CongDongCViet.com
    Lấy 50% ngẫu nhiên nó sẽ lấy ngẫu nhiên được các dòng: 5 8 3 1
    Vậy nó sẽ giữ nguyên hay sắp xếp lại theo: 1 3 5 8
    sắp xếp hay không sắp xếp thì không quan trọng...mình mới đọc random được 1 dòng thôi à..đọc random nhiều dòng thì chưa được...mệt thiệt!

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bạn có tổng các dòng là n, bạn lấy 70% của n rồi random ra số (thứ tự) dòng cần lấy thôi
    lấy trùng dòng có được không, random mà

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đoạn mã dươi đây, mỗi câu lệnh mình đều giải thích rõ, hãy đọc kĩ lời giải thích.
    Mình chỉ hướng dẫn cách lấy ngẫu nhiên mà không bị trùng.
    Chưa kiểm tra giá trị phần trăm bị âm và lớn hơn 100%.

    Có thể chạy thử trên máy bạn, nếu không thì có thể chạy thử trên: http://www.compileonline.com/compile_csharp_online.php

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.IO; namespace ConsoleTest {    class Program {         #region Test1        public void Test() {            float Percent = 50;            // Chuỗi ví dụ bao gồm 3 kiểu xuống dòng: 
    , 
     và 
    .            //string Input = "Tôi là SITUVN.
    
    
    Có cái gì đó rất rất...
    Xin chào!
    Tạm biệt!
    Việt Nam tôi yêu!
    
    Ngày mai tôi đi phỏng vấn.
    
    Khóc nữa đi thằng khốn!
    CongDongCViet.com";            string Input = "Toi la SITUVN.
    
    
    Co cai gi do rat rat...
    Xin chao!
    Tam biet!
    Viet Nam toi yeu!
    
    Ngay mai toi di phong van.
    
    Khoc nua di thang khon!
    CongDongCViet.com";            // Lưu từng dòng            string[] InputLines;            // Lưu các chỉ số của các dòng được chọn.            int[] ChooseLine;             /////////////////////////////////////            // TÁCH DÒNG (CHO PHÉP DÒNG TRỐNG) //            /////////////////////////////////////             // CÁCH DÙNG REGEX            // Regex để tách chuỗi.            Regex bl = new Regex("
    ");            // Thay thế hết các kí tự 
     và 
     bằng 
    .            Input = Input.Replace("
    ", "
    ").Replace("
    ", "
    ").Replace("
    ", "
    ");            // Lấy số dòng.            InputLines = bl.Split(Input);             //// CÁCH DÙNG string.Split()            //// Thay thế hết các kí tự 
     và 
     bằng 
    .            //Input = Input.Replace("
    ", "
    ").Replace("
    ", "
    ");            //// Lấy số dòng.            //InputLines = Input.Split('
    ');             // Tính số dòng cần lấy            ChooseLine = new int[(int)((float)InputLines.Length * (Percent / 100F))];             /////////////////////////            // LẤY DÒNG NGẪU NHIÊN //            /////////////////////////             // Đối tượng tạo số ngẫu nhiên            Random r = new Random();            // Lưu số dòng ngẫu nhiên            int RandomLine = -1;            // Lưu kiểm tra trùng            bool IsDuplicate = false;            // Lưu chỉ số chạy            int i = 0;            // Lấy dòng ngẫu nhiên theo chỉ số dòng bắt đầu từ 0 và nhỉ hơn số dòng.            while (i < ChooseLine.Length) {                // Lấy ngẫu nhiên.                RandomLine = r.Next(InputLines.Length);                // Gán về la không trùng                IsDuplicate = false;                // Kiểm tra liệu có trùng                for (int j = 0; j < i; j++) {                    // Nếu giá trị ngẫu nhiên hiện tại có trùng                    if (ChooseLine[j] == RandomLine) {                        // Gán là trùng                        IsDuplicate = true;                        // và ngắt vòng lặp j                        break;                    }                }                // Nếu không trùng                if (!IsDuplicate) {                    // Gán giá trị vào chỉ số hiện tại                    ChooseLine[i] = RandomLine;                    // Tăng i lên 1                    i++;                }                // Ngược lại trùng thì vẫn ngữ nguyên i và tiếp tục lấy số mới cho đến khi không trùng            }             // In ra các dòng được chọn             // In ra chỉ số cá dòng được chọn.            Console.Write("Chosen lines: ");            for (int x = 0; x < ChooseLine.Length; x++) {                Console.Write(ChooseLine[x] + " ");            }            // Xuống dòng để dễ nhìn            Console.WriteLine();            Console.WriteLine("----------------");            // In ra nội dung dòng được chọn.            for (int x = 0; x < ChooseLine.Length; x++) {                Console.WriteLine(InputLines[ChooseLine[x]]);            }            Console.WriteLine("----------------");        }        #endregion          static void Main(string[] args) {            new Program().Test();        }    }}

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi SITUVNX
    Đoạn mã dươi đây, mỗi câu lệnh mình đều giải thích rõ, hãy đọc kĩ lời giải thích.
    Mình chỉ hướng dẫn cách lấy ngẫu nhiên mà không bị trùng.
    Chưa kiểm tra giá trị phần trăm bị âm và lớn hơn 100%.

    Có thể chạy thử trên máy bạn, nếu không thì có thể chạy thử trên: http://www.compileonline.com/compile_csharp_online.php

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.IO; namespace ConsoleTest {    class Program {         #region Test1        public void Test() {            float Percent = 50;            // Chuỗi ví dụ bao gồm 3 kiểu xuống dòng: 
    , 
     và 
    .            //string Input = "Tôi là SITUVN.
    
    
    Có cái gì đó rất rất...
    Xin chào!
    Tạm biệt!
    Việt Nam tôi yêu!
    
    Ngày mai tôi đi phỏng vấn.
    
    Khóc nữa đi thằng khốn!
    CongDongCViet.com";            string Input = "Toi la SITUVN.
    
    
    Co cai gi do rat rat...
    Xin chao!
    Tam biet!
    Viet Nam toi yeu!
    
    Ngay mai toi di phong van.
    
    Khoc nua di thang khon!
    CongDongCViet.com";            // Lưu từng dòng            string[] InputLines;            // Lưu các chỉ số của các dòng được chọn.            int[] ChooseLine;             /////////////////////////////////////            // TÁCH DÒNG (CHO PHÉP DÒNG TRỐNG) //            /////////////////////////////////////             // CÁCH DÙNG REGEX            // Regex để tách chuỗi.            Regex bl = new Regex("
    ");            // Thay thế hết các kí tự 
     và 
     bằng 
    .            Input = Input.Replace("
    ", "
    ").Replace("
    ", "
    ").Replace("
    ", "
    ");            // Lấy số dòng.            InputLines = bl.Split(Input);             //// CÁCH DÙNG string.Split()            //// Thay thế hết các kí tự 
     và 
     bằng 
    .            //Input = Input.Replace("
    ", "
    ").Replace("
    ", "
    ");            //// Lấy số dòng.            //InputLines = Input.Split('
    ');             // Tính số dòng cần lấy            ChooseLine = new int[(int)((float)InputLines.Length * (Percent / 100F))];             /////////////////////////            // LẤY DÒNG NGẪU NHIÊN //            /////////////////////////             // Đối tượng tạo số ngẫu nhiên            Random r = new Random();            // Lưu số dòng ngẫu nhiên            int RandomLine = -1;            // Lưu kiểm tra trùng            bool IsDuplicate = false;            // Lưu chỉ số chạy            int i = 0;            // Lấy dòng ngẫu nhiên theo chỉ số dòng bắt đầu từ 0 và nhỉ hơn số dòng.            while (i < ChooseLine.Length) {                // Lấy ngẫu nhiên.                RandomLine = r.Next(InputLines.Length);                // Gán về la không trùng                IsDuplicate = false;                // Kiểm tra liệu có trùng                for (int j = 0; j < i; j++) {                    // Nếu giá trị ngẫu nhiên hiện tại có trùng                    if (ChooseLine[j] == RandomLine) {                        // Gán là trùng                        IsDuplicate = true;                        // và ngắt vòng lặp j                        break;                    }                }                // Nếu không trùng                if (!IsDuplicate) {                    // Gán giá trị vào chỉ số hiện tại                    ChooseLine[i] = RandomLine;                    // Tăng i lên 1                    i++;                }                // Ngược lại trùng thì vẫn ngữ nguyên i và tiếp tục lấy số mới cho đến khi không trùng            }             // In ra các dòng được chọn             // In ra chỉ số cá dòng được chọn.            Console.Write("Chosen lines: ");            for (int x = 0; x < ChooseLine.Length; x++) {                Console.Write(ChooseLine[x] + " ");            }            // Xuống dòng để dễ nhìn            Console.WriteLine();            Console.WriteLine("----------------");            // In ra nội dung dòng được chọn.            for (int x = 0; x < ChooseLine.Length; x++) {                Console.WriteLine(InputLines[ChooseLine[x]]);            }            Console.WriteLine("----------------");        }        #endregion          static void Main(string[] args) {            new Program().Test();        }    }}
    cảm ơn mọi người nha..mình test được rồi..ai có ý khác thì cứ đóng góp nha.[IMG]images/smilies/clap_grin.gif[/IMG]

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    có 1 cách khác là Đọc toàn bộ file sau đó phần thành 2 cột , gán cột 1 = 0

    Ví dụ :

    Em Là Ai
    Em tên gì
    Anh là ai
    Anh tên gì

    Sau khi load trong file text gán nó vào thành 2 cột

    0 Em Là Ai
    0 Em Tên gì
    0 Anh là ai
    0 Anh tên gì


    Sau khi random trong các dòng thì cho giá trị 0 thành 1 , và cứ checking lúc lấy random , nếu ko đc thì cứ tiếp tục random ngẫu nhiên thôi

    Cách thì có nhiều nhưng nếu tăng lên 1 đơn vị cũng ko phải cách hay như bạn trên post


    Mình chỉ là ý tưởng , vừa nhập môn C# nên vẫn đang học hỏi , mong các bạn giúp đỡ

  10. #10
    tự nhiên lại phải tạo thêm 1 cột làm gì nữa hả bạn

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •