Сопоставление частичной строки регулярного выражения с CSV

Позвольте мне предварить это, сказав, что я полный любитель, когда дело доходит до 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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 463
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

IL. 08.10.2008 07:23

s /, (?!) / "," / Сработало отлично, спасибо. Я использую Perl, поэтому могу запускать скрипт для файлов по мере их отправки. Сохраняет открытие его в парсере и работу с ним там. Кроме того, я все равно хотел изучить Perl и RegEx, так что два зайца одним выстрелом. Спасибо за вашу помощь :).

IL. 08.10.2008 08:28

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

Этот вопрос похож на: Замените шаблоны, находящиеся внутри разделителей, с помощью вызова регулярного выражения.

Это могло сработать:

s/"([^"]*)"|([^",]+)/""/g

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

ephemient 08.10.2008 07:47

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

IL. 08.10.2008 08:23

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

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

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

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

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

Другие вопросы по теме