Я работаю над приложением, которое импортирует тысячи строк, где каждая строка имеет следующий формат:
|* 9070183020 |04.02.2011 |107222 |M/S SUNNY MEDICOS |GHAZIABAD | 32,768.00 |
Я использую следующие Regex
, чтобы разбить строки на нужные мне данные:
Regex lineSplitter = new Regex(@"(?:^\|\*|\|)\s*(.*?)\s+(?=\|)");
string[] columns = lineSplitter.Split(data);
foreach (string c in columns)
Console.Write("[" + c + "] ");
Это дает мне следующий результат:
[] [9070183020] [] [04.02.2011] [] [107222] [] [M/S SUNNY MEDICOS] [] [GHAZIABAD] [] [32,768.00] [|]
Теперь у меня два вопроса. 1.Как удалить пустые результаты. Я знаю, что могу использовать:
string[] columns = lineSplitter.Split(data).Where(s => !string.IsNullOrEmpty(s)).ToArray();
, но есть ли какой-нибудь встроенный метод для удаления пустых результатов? 2.Как я могу удалить последнюю трубу? Спасибо за любую помощь.С Уважением,Йогеш.
РЕДАКТИРОВАТЬ: Я думаю, что мой вопрос был немного неправильно понят.Это никогда не было о , как я могу это сделать .Это было примерно , как я могу сделать это, изменив Regex
в приведенном выше коде .
Я знаю, что могу сделать это разными способами.Я уже сделал это с кодом, упомянутым выше, с предложением Where
и с альтернативным способом, который также (более чем в два раза) быстрее:
Regex regex = new Regex(@"(^\|\*\s*)|(\s*\|\s*)");
data = regex.Replace(data, "|");
string[] columns = data.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
Во-вторых, в качестве тестового примера, моя системаможет проанализировать 92k + таких строк менее чем за 1,5 секунды в исходном методе и менее чем за 700 миллисекунд во втором методе, где я никогда не найду более пары тысяч в реальных случаях, поэтому я не думаю, что мне нужно думатьо скорости здесь.По моему мнению, думать о скорости в этом случае - преждевременная оптимизация.
Я нашел ответ на свой первый вопрос: это невозможно сделать с помощью Split
, поскольку такой опции нет.
Все еще ищу ответ на мой второй вопрос.