Разбор запятых и кавычек в вырожденных файлах CSV с помощью регулярных выражений - PullRequest
1 голос
/ 27 марта 2010

Мне нужно проанализировать входы строк, где столбцы разделены столбцами, а любое поле, содержащее запятую в данных, заключено в кавычки (разделенные запятыми, идентификаторы в кавычках). Для этого проекта мне нужно удалить кавычки и любые запятые, которые встречаются между парами кавычек. По сути, мне нужно удалить запятые и кавычки, содержащиеся в полях, сохранив запятые, которые используются для разделения полей. Вот небольшой код, который я собрал для обработки простого сценария:

// Sample input 1: This works and covers 99% of the records that I need to parse.
string str1 = "an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,\"This Address Works, Suite 200\",Some City,TN,09876-5432,9795551212x123,XYZ";
str1 = Regex.Replace(str1, "\"([^\"^,]*),([^\"^,]*)\"", "$1$2");
Console.WriteLine(str1);
// Outputs: an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,This Address Works Suite 200,Some City,TN,09876-5432,9795551212x123,XYZ

Хотя этот код работает для большинства моих записей, он не работает, когда поле содержит более одной запятой. Я хотел бы изменить код так, чтобы он удалял каждый экземпляр запятой, содержащейся в столбце, независимо от количества запятых в поле. Я не хочу жестко кодировать только обработку 2 запятых, или 3 запятых, или 25 запятых. Код должен просто удалить все запятые в поле. Ниже приведен пример того, что мой код не обрабатывает должным образом.

// Sample input 2: This doesn't work since there is more than 1 comma between the quotes.
string str2 = "an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,\"i,l,k,e, c,o,m,m,a,s, i,n ,m,y, f,i,e,l,d\",Some City,TN,09876-5432,9795551212x123,XYZ";
str2 = Regex.Replace(str2, "\"([^\"^,]*),([^\"^,]*)\"", "$1$2");
Console.WriteLine(str2);
// Desired output: an_email_address@somewhere.com,2010/03/27 12:2:02,,some_first_name,some_last_name,,i like commas in my field,Some City,TN,09876-5432,9795551212x123,XYZ

Как я могу сделать это с помощью регулярных выражений?

Ответы [ 2 ]

3 голосов
/ 27 марта 2010

Соответствующие кавычки и регулярные выражения не идут рука об руку, и вам, вероятно, лучше использовать синтаксический анализатор CSV, как предложил Майкл Мэдсен.
Однако, если вы знаете, что кавычки появляются только так, как вы ожидаете, вы можете сделать что-то вроде следующего:

str2 = Regex.Replace(str2, "\"[^\"]*\"",
                     match => match.Value.Trim('\"').Replace(",", ""));
2 голосов
/ 28 марта 2010

Вот простая версия регулярного выражения:

str2 = Regex.Replace(str0, 
          @"""|,(?=(?>[^""]*""[^""]*(?:""[^""]*""[^""]*)*)$)", 
          String.Empty);

Соответствует любой кавычке или запятой, если за ней следует нечетное количество кавычек, и заменяет ее ничем.

Я бы пошел по этому пути только в том случае, если бы мне это было совершенно необходимо, например, если бы я работал со структурой, которая позволяла мне только указать регулярное выражение и строку замены.В противном случае, я бы либо использовал подход @ Kobi (потому что он гораздо более читабелен), либо использовал бы выделенный процессор CSV.Их не сложно найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...