C # Regex.Split: Удаление пустых результатов

Я работаю над приложением, которое импортирует тысячи строк, где каждая строка имеет следующий формат:

|* 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 , поскольку такой возможности нет.

Все еще ищу ответ на свой второй вопрос.

30
задан Yogesh 6 February 2011 в 13:06
поделиться