Regex для соответствия вложенным кавычкам CSV-файла - PullRequest
1 голос
/ 09 июня 2010

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

Скажем, в CSV-файле есть строка, подобная этой:

"123", 456, "701 "B" Street", 910
                 ^^^

Существует ли простое регулярное выражение для обнаружения "B" (поскольку это не экранированный набор кавычек в обычных кавычках CSV) и замены его чем-то вроде \"B\"? Последняя строка будет выглядеть так:

"123", 456, "701 \"B\" Street", 910

Помощь будет принята с благодарностью!

Ответы [ 5 ]

4 голосов
/ 09 июня 2010

Поверьте мне, вы не хотите делать это с помощью регулярных выражений.Вы хотите что-то вроде Java CSV Library .

1 голос
/ 21 ноября 2014
(?<!^)(?<!",)(?<!\d,)"(?!,")(?!,\d)(?!$)(?!,-\d)

Я получил это на работу, думал, что я опубликую это, если кто-то еще ищет ответ

1 голос
/ 09 июня 2010

Есть несколько миллиардов библиотек, которые помогут вам разобрать CSV, но если вы хотите использовать регулярные выражения для академических целей, это может помочь:

  • строка в кавычках с поддержкой escape. "(\\ |. [^ \\"]) * "
  • поле без кавычек: [^ ",] *
  • разделитель:, *

Я не использую CSV-файлы, поэтому я не уверен в правильности «другого поля csv» (соответствует 456, например, выше) или в качестве разделителя /, * / вы хотите ..

В любом случае объединение вышеперечисленного будет соответствовать одному полю и одному разделителю (или концу строки):

(quotedstring|unquoted)(delimiter|$)
0 голосов
/ 09 июня 2010

Ваш пример неверный CSV:

"123", 456, "701 "B" Street", 910

это на самом деле должно быть:

"123", 456, "701 ""B"" Street", 910

(Конечно, существует множество вариаций CSV, но поскольку большую часть времени люди хотят использовать его с Excel или доступом, я придерживаюсь определения Microsoft.)

Поэтому регулярное выражение для этого может выглядеть так:

".+("").+("").+"

Группы (в скобках) будут вашими двойными кавычками, а остальные гарантируют, что они находятся в другом наборе кавычек.

Это покрывает часть поиска ваших потребностей. Запасная часть зависит от того, в чем вы программируете.

0 голосов
/ 09 июня 2010

Я бы использовал выражение sed в качестве

's/\(.*\),\(.*\),\(.*\)"\(.*\)\" \(.*\),\(.*\)/\1,\2,\3 \4 \5 \6/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...