tôi đang làm việc trên một ứng dụng mà nhập khẩu hàng ngàn dòng mà mỗi dòng có một định dạng như thế này:C# Regex.Split: Xóa kết quả rỗng
|* 9070183020 |04.02.2011 |107222 |M/S SUNNY MEDICOS |GHAZIABAD | 32,768.00 |
Tôi đang sử dụng Regex
sau để phân chia các dòng vào dữ liệu tôi cần:
Regex lineSplitter = new Regex(@"(?:^\|\*|\|)\s*(.*?)\s+(?=\|)");
string[] columns = lineSplitter.Split(data);
foreach (string c in columns)
Console.Write("[" + c + "] ");
này được đưa ra cho tôi những kết quả sau:
[] [9070183020] [] [04.02.2011] [] [107222] [] [M/S SUNNY MEDICOS] [] [GHAZIABAD] [] [32,768.00] [|]
N Tôi có hai câu hỏi.
1. Làm cách nào để xóa kết quả trống. Tôi biết tôi có thể sử dụng:
string[] columns = lineSplitter.Split(data).Where(s => !string.IsNullOrEmpty(s)).ToArray();
nhưng có phương pháp tích hợp nào để xóa kết quả trống không?
2. Làm thế nào tôi có thể tháo ống cuối cùng?
Cảm ơn bạn đã được trợ giúp.
Kính trọng,
Yogesh.
CHỈNH SỬA:
Tôi nghĩ câu hỏi của tôi hơi bị hiểu lầm. Nó không bao giờ về làm thế nào tôi có thể làm điều đó. Chỉ khoảng làm cách nào tôi có thể làm điều đó bằng cách thay đổi Regex
trong mã trên.
Tôi biết rằng tôi có thể thực hiện theo nhiều cách. Tôi đã thực hiện nó với mã đề cập ở trên với một điều khoản Where
và với một cách thay thế mà cũng là (hơn hai lần) nhanh hơn:
Regex regex = new Regex(@"(^\|\*\s*)|(\s*\|\s*)");
data = regex.Replace(data, "|");
string[] columns = data.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Thứ hai, như một trường hợp thử nghiệm, hệ thống của tôi có thể phân tích cú pháp 92k + như vậy các dòng trong chưa đầy 1,5 giây trong phương thức gốc và trong ít hơn 700 mili giây trong phương pháp thứ hai, nơi tôi sẽ không bao giờ tìm thấy hơn một vài nghìn trong các trường hợp thực, vì vậy tôi không nghĩ rằng tôi cần suy nghĩ về tốc độ ở đây . Theo tôi nghĩ về tốc độ trong trường hợp này là tối ưu hóa sớm.
Tôi đã tìm thấy câu trả lời cho câu hỏi đầu tiên của tôi: nó không thể được thực hiện với Split
như không có tùy chọn như vậy được xây dựng trong
Vẫn đang tìm kiếm câu trả lời cho câu hỏi thứ hai của tôi..
Để trả lời câu hỏi đầu tiên của bạn, tôi tin rằng phần nhóm của regex phải là '@" (. +?) "'. Nếu không nó sẽ có thể phù hợp với khoảng trống (đó là những gì bạn có bây giờ). –
Những vấn đề nghiêm trọng trong trường hợp này là Jeff. Nó sẽ cho kết quả chính xác tương tự. – Yogesh
Cũng giống như một lưu ý khi bạn đang đề cập đến hàng ngàn mục: Sử dụng String.Split và sau đó thực hiện một số thao tác String khác nhanh hơn nhiều so với sử dụng Regex ở vị trí đầu tiên. – Foxfire