-
19-09-2013, 02:55 PM #1Junior Member
- 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!!View more random threads:
- Cách tạo Module giữa XML và LINQ trong C#?
- Vấn đề về Request có sử dụng Proxy/Sock trong C#
- Bỏ thuộc tính thêm dòng mới tự động của DataGridView?
- Chèn các đối tượng hình ảnh, bảng biểu trong trình soạn thảo và lưu vào Database
- đăng nhập facebook trong C# windows form
- Lỗi: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
- Xử lý dữ liệu nhận về từ cổng COM trong thời gian thực... như thế nào?
- Keyword "base" trong C# có nghĩa gì?
- Tự động update
- Lập trình cho ứng dụng để file được mở bằng cách chuột phải vào file click vào Open With tới ứng dụng hỗ trợ file đó
-
19-09-2013, 03:28 PM #2Junior Member
- 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.
-
19-09-2013, 04:44 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi SITUVNX
-
19-09-2013, 05:18 PM #4Junior Member
- 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
Vậy nó sẽ giữ nguyên hay sắp xếp lại theo: 1 3 5 8
-
19-09-2013, 05:33 PM #5Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi SITUVNX
-
19-09-2013, 06:25 PM #6Junior Member
- 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à
-
20-09-2013, 08:30 AM #7Junior Member
- 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(); } }}
-
20-09-2013, 04:00 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi SITUVNX
-
22-09-2013, 12:25 PM #9Junior Member
- 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 đỡ
-
22-09-2013, 02:20 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
tự nhiên lại phải tạo thêm 1 cột làm gì nữa hả bạn
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...