Нужна помощь регулярных выражений для очистки данных с разделителями
У меня есть некоторые данные с разделителями каналов, которые выглядят так:
field|field|field|field|another "field"|field
field|field|field|"another" field|field|field
field|"fie|ld"|field|field|field|field
И проблема, с которой я сталкиваюсь, заключается в том, что двойные кавычки неправильно сформированы для поля с разделителями (поля, содержащие разделитель или кавычки, должны быть заключены в двойные кавычки, а двойные кавычки должны быть удалены с другой двойной кавычкой). Вот что должно быть на выходе:
field|field|field|field|"another ""field"""|field
field|field|field|"""another"" field"|field|field
field|"fie|ld"|field|field|field|field
Кто-нибудь знает, есть ли простой способ сделать это с помощью регулярного выражения?
1 ответ
Решение
Только некоторые из этих операций подходят для регулярных выражений. Другие части лучше подходят для регулярного выполнения программы. Regex все еще может быть неотъемлемой частью операции, но, по возможности, используйте встроенную обработку строк.
Использование PCRE:
- Читайте в одной строке входной строки.
- Разделить линию в любом матче на
"[^"]*"(*SKIP)(*F)|\|
чтобы получить список полей. - Для каждого поля:
- Если он содержит совпадение с
(?<!^)"(?!$)
, окружить поле в кавычках. - После этого замените каждый матч на
(?<!^)"(?!$)
с""
,
- Если он содержит совпадение с
- Вернитесь к списку полей и выведите его в виде строки нового CSV.
- Вернитесь к шагу #1, пока все строки не будут обработаны.