Regex Partial String CSV Matching - PullRequest
       11

Regex Partial String CSV Matching

0 голосов
/ 08 октября 2008

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

Two words,Word,Word,Word,"Number, number"

Что мне нужно сделать, так это отформатировать ...

"Two words","Word",Word","Word","Number, number"

У меня был шаблон RegEx

s/,/","/g

работает, за исключением того, что он также заменяет запятую в уже указанном разделе Number, number, что приводит к разделению поля и разрыву файла. По сути, мне нужно изменить мой шаблон, чтобы заменить запятую на «,» [цитата запятой цитата], но только когда за запятой не следует пробел. Обратите внимание, что в других полях после запятой никогда не будет пробела, только список номеров с разделителями.

Мне удалось написать

s/,[A-Za-z0-9]/","/g

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

s/(,)[A-Za-z0-9]\b

должно работать, но это не так.

У кого-нибудь есть идеи?

Ответы [ 4 ]

2 голосов
/ 08 октября 2008

Мой опыт показывает, что это не очень хорошее использование регулярных выражений. Как уже было сказано, CSV-файлы лучше обрабатываются настоящими CSV-парсерами. Вы не пометили язык, поэтому трудно сказать, но в perl я использую Text :: CSV_XS или DBD :: CSV (что позволяет SQL получать доступ к CSV-файлу, как к таблице, что, конечно использует Text :: CSV_XS под обложками). Гораздо проще, чем кататься самостоятельно, и гораздо надежнее, чем использовать регулярные выражения.

1 голос
/ 08 октября 2008

s/,([^ ])/","$1/ будет соответствовать «,», за которым следует «not-a-space», захватывая not-a-space, а затем заменяя все это на захваченную часть.

В зависимости от того, какой движок регулярных выражений вы используете, вы можете писать \1 или другие вещи вместо $1.

Если вы используете Perl или иным образом имеете доступ к движку регулярных выражений с отрицательным прогнозом, s/,(?! )/","/ ("," без пробела) работает.

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

0 голосов
/ 08 октября 2008

Похоже, вы используете Sed.

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

Через sed ваша команда будет:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Обратите внимание, что вам все равно придется ставить двойные кавычки в начале и конце строки.

0 голосов
/ 08 октября 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...