2010-06-09 2 views
0

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

Say есть строка в CSV файл, как это:

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

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

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

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

+0

ли 456 и 910 должны котироваться?Или у вас есть только некоторые из полей в CSV? –

+0

Возможный дубликат [Разбор CSV-входа с RegEx в java] (http://stackoverflow.com/questions/1441556/parsing-csv-input-with-a-regex-in-java) –

+0

Некоторые поля цитируются, а некоторые нет, к сожалению – user361970

ответ

4

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

+0

Да, я согласен. К сожалению, я скромный разработчик, использующий решение на основе StreamTokenizer, которое, к сожалению, не могу просто отказаться. Это было бы хорошо, если бы эти внутренние кавычки были ускользали. – user361970

+1

@ user361970 - если у вас есть сломанное решение, которое вам нужно исправить, * конечно * вы можете отказаться от него и сделать это лучше. Конечно, мы не можем говорить о более чем 100 строках кода здесь. Если ваш босс говорит иначе, отправьте его в SO, чтобы мы могли объяснить ему, почему плохая идея исправлять плохой код. –

+0

StreamTokenizer - это даже WORSE –

1

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

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

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

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

(quotedstring|unquoted)(delimiter|$) 
0

Я хотел бы использовать с учетом патч в выражение, как

's/\(.*\),\(.*\),\(.*\)"\(.*\)\" \(.*\),\(.*\)/\1,\2,\3 \4 \5 \6/g' 
+0

Это может быть способ пойти в промежутке – user361970

+0

как бы изменить это для экранирования с \ вместо замены пустой строкой? – user361970

+0

Простой '' s/\ (. * \), \ (. * \), \ (. * \) "\ (. * \) \" \ (. * \), \ (. * \)/\ 1, \ 2, \ 3 \\\ "\ 4 \\" \ 5 \ 6/g'' Обратите внимание, что \\ приведет к печати \ и "будет печатать" вокруг \ 4 Надеюсь, что ответит на него. –

0

Ваш пример не является правильным CSV:

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

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

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

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

Поэтому регулярное выражение для этого может выглядеть следующим образом:

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

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

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

+0

Не совсем. В случае с CSV вы ищете шаблон типа '([^"] | "") * ': соответствует токенам, сделанным из не кавычек или двух кавычек.'. + 'Может совпадать с кавычками в любом случае и'. + (""). + (""). + 'принимает слишком конкретный формат - он допускает только два кавычки, а' + 'требует символов до, между ними и после них. – Kobi

+0

Ahh ... это правда. что я получаю за ответ так близко после обеда. Я всегда путаю свои плюсы и звездочки ... – Ricosuave

0
(?<!^)(?<!",)(?<!\d,)"(?!,")(?!,\d)(?!$)(?!,-\d) 

я получил эту работу, я думал бы разместить его, если кто-то ищет ответ

Смежные вопросы