pracuję nad aplikacji, który importuje tysiące wierszy, gdzie każda linia ma format takiego:C# Regex.Split: Usuwanie pustych wyników
|* 9070183020 |04.02.2011 |107222 |M/S SUNNY MEDICOS |GHAZIABAD | 32,768.00 |
Używam następujący Regex
podzielić linie na dane potrzebne:
Regex lineSplitter = new Regex(@"(?:^\|\*|\|)\s*(.*?)\s+(?=\|)");
string[] columns = lineSplitter.Split(data);
foreach (string c in columns)
Console.Write("[" + c + "] ");
To daje mi następujący wynik:
[] [9070183020] [] [04.02.2011] [] [107222] [] [M/S SUNNY MEDICOS] [] [GHAZIABAD] [] [32,768.00] [|]
N ow mam dwa pytania.
1. Jak usunąć puste wyniki. wiem, że mogę używać:
string[] columns = lineSplitter.Split(data).Where(s => !string.IsNullOrEmpty(s)).ToArray();
ale jest tam żadnych budowane w sposób usuwania pustych wyniki?
2. Jak mogę usunąć ostatnią rurę?
Dziękuję za pomoc.
Pozdrawiam,
Yogesh.
EDYCJA: Myślę, że moje pytanie było trochę źle zrozumiane. Nigdy nie było o jak mogę to zrobić. Było tylko około jak mogę to zrobić, zmieniając Regex
w powyższym kodzie.
Wiem, że mogę to zrobić na wiele sposobów. I zrobiono go z kodem wspomniano powyżej, z Where
klauzuli iz alternatywnym sposób, który jest również (więcej niż dwa razy) szybciej:
Regex regex = new Regex(@"(^\|\*\s*)|(\s*\|\s*)");
data = regex.Replace(data, "|");
string[] columns = data.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Po drugie, w przypadku testowego, mój system może analizować 92K + takie linie w mniej niż 1,5 sekundy w oryginalnej metodzie iw mniej niż 700 milisekund w drugiej metodzie, gdzie nigdy nie znajdę więcej niż kilka tysięcy w rzeczywistych przypadkach, więc nie sądzę, że muszę myśleć o prędkości tutaj . Moim zdaniem myślenie o prędkości w tym przypadku to przedwczesna optymalizacja.
znalazłem odpowiedzi na moje pierwsze pytanie: nie można zrobić z Split
jak nie ma takiej opcji wybudowany w
Nadal szukasz odpowiedzi na moje drugie pytanie..
Odpowiadając na pierwsze pytanie, uważamy, że częścią wyrażenia regularnego powinno być '@" (. +?) "'. W przeciwnym razie możliwe byłoby dopasowanie pustych pól (co teraz masz). –
W tym przypadku nie ma to większego znaczenia, Jeff. Da to dokładnie taki sam wynik. – Yogesh
Tak jak w notatce, o której wspominasz tysiące wpisów: Używanie String.Split, a następnie robienie więcej Przetwarzanie ciągów jest znacznie szybsze niż używanie Regexa w pierwszej kolejności. – Foxfire