#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] )),?)";
Вы можете увидеть это в действии здесь:
Что приводит к этому:
<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. Спасибо за усилия, Эдер. Я не смог заставить выражение сделать это, поэтому в итоге я пошел другим путем, проведя рефакторинг таким образом, чтобы не изменить поведение по умолчанию.