Одно регулярное выражение для декодирования CSV со встроенными кавычками и запятыми

#c# #.net #regex #excel #csv

#c# #.net #регулярное выражение #excel #csv

Вопрос:

У меня много данных CSV, которые я пытаюсь декодировать с помощью регулярных выражений. На самом деле я пытался использовать существующую базу кода, которую другие люди / проекты используют, и не хочу рисковать, нарушая их потоки данных, слишком сильно рефакторинг класса. Итак, мне было интересно, возможно ли декодировать этот текст с помощью одного регулярного выражения (именно так работает класс в настоящее время):

 f1,f2,f3,f4,f5,f6,f7
,"clean text","with,embedded,commas.","with""embedded""double""quotes",,"6.1",
 

Первая строка — это заголовок. Если я сохраню это как xxx.csv и открою в Excel, он правильно декомпилирует его для чтения (обратите внимание, что пробел между полями — это разрывы ячеек):

 f1  f2  f3  f4  f5  f6  f7
clean text  with,embedded,commas.   with"embedded"double"quotes     6.1     
 

Но когда я пытаюсь это сделать в .net, я застреваю на регулярном выражении. У меня есть это:

 string regExp = "(((?<x>(?=[,\r\n] ))|"(?<x>([^"]|"") )"|(?<x>[^,\r\n] )),?)";
 

Вы можете увидеть это в действии здесь:

http://ideone.com/hRq8xe

Что приводит к этому:

 <start>

clean text
with,embedded,commas.
with""embedded""double""quotes

6.1
<end>
 

Это очень близко, но оно не заменяет экранированные двойные двойные кавычки одинарными двойными кавычками, как это делает Excel. Я не мог придумать регулярное выражение, которое работало бы лучше. Можно ли это сделать?

Комментарии:

1. вы идете по самому сложному пути для достижения своей цели

2. используйте анализатор csv

Ответ №1:

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

  • предложение if-then (?(?=regex)then|else)
  • несколько предложений if-then (?(?=condition)(then1|then2|then3)|(else1|else2|else3))

Я придумал следующий шаблон, чтобы соответствовать тексту вашего текста: ([^,] (?(?=[^,])([^"] ")|([^,] ,))) однако вам нужно будет приложить дополнительные усилия, чтобы создать полностью совпадающее выражение для вашего текста или в конечном итоге использовать анализатор файлов. Если это так, вы можете взглянуть на FileHelpers, довольно аккуратную библиотеку для синтаксического анализа текстовых файлов.

Источники:

Комментарии:

1. Спасибо за усилия, Эдер. Я не смог заставить выражение сделать это, поэтому в итоге я пошел другим путем, проведя рефакторинг таким образом, чтобы не изменить поведение по умолчанию.