Поиск регулярных выражений в Notepad++ для поиска и замены CRLF только между двумя кавычками ["]

У меня есть CSV-файл с 600 записями, где мне нужно заменить [CRLF] на [пробел], но только когда [CRLF] находится между двумя ["] (кавычки). Когда второй ["] затем следует пропустить оставшуюся часть строки и перейти к следующей строке в тексте.

У меня действительно нет отправной точки. Надеюсь, кто-то придумает предложение.

Пример:

John und Carol,,Smith,,,J.S.,,,,,,,,,,,,,+11 22 333 4444,,,,,"streetx 21[CRLF]
New York City[CRLF]
USA",streetx 21,,,,New York City,,,USA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Normal,,My Contacts,[CRLF]

В этом случае два [CRLF] после первого ["] необходимо заменить на пробел []. При обнаружении второго ["] пропустите конец строки и перейдите к следующей строке.

Затем снова, теперь на следующей строке, после того, как первый ["] обнаружен, замените все [CRLF], пока не встретите второй ["]. [CRLF] различаются по количеству. В CSV-файле количество запятых [,] до (23) и после (65) двух кавычек ["] является постоянным.

Поэтому, возможно, можно использовать счетчик запятых. Я не знаю.

Спасибо за отзыв.

3 ответа

Решение

Это будет работать только с одним регулярным выражением (протестировано в Notepad++):

Введите это регулярное выражение в Find what поле:

((?:^|\r\n)[^"]*+"[^\r\n"]*+)\r\n([^"]*+")

Введите эту строку в Replace with поле:

$1 $2

Убедитесь, что Wrap around флажок (и Regular expression переключатель) выбраны.

Сделать Replace All столько раз, сколько требуется (пока не появится диалоговое окно "0 вхождений было заменено").

Объяснение:

(
  (?:^|\r\n)     Begin at start of file or before the CRLF before the start of a record
  [^"]*+         Consume all chars up to the opening "
  "              Consume the opening "
  [^\r\n"]*+     Consume all chars up to either the first CRLF or the closing "
)                Save as capturing group 1 (= everything in record before the target CRLF)
\r\n             Consume the target CRLF without capturing it
(
  [^"]*+         Consume all chars up to the closing "
  "              Consume the closing "
)                Save as capturing group 2 (= the rest of the string after the target CRLF)

Примечание: *+ является собственническим квантификатором. Используйте их соответствующим образом, чтобы ускорить выполнение.

Обновить:

Эта более общая версия регулярного выражения будет работать с любой последовательностью разрыва строки (\r\n, \r или же \n):

((?:^|[\r\n]+)[^"]*+"[^\r\n"]*+)[\r\n]+([^"]*+")

В этом случае исходные данные генерируются функцией экспорта в GMail для ваших контактов. После изменения, описанного ниже (без RegEx), результат можно использовать, чтобы привести в порядок базу данных контактов и повторно импортировать ее в GMail или MS Outlook. Да, я стою на плечах @alan и @robinCTS. Спасибо вам обоим.

Инструкция в 5 шагов:

использовать Блокнот ++ / найти заменить / расширенный режим поиска / обтекание = вкл

-1- заменить все [CRLF] уникальным набором символов или строкой (я использовал [~~])

находить: \r\n и заменить на: ~~ Содержимое файла теперь в одной строке.

-2- Теперь нам нужно отделить строку заголовка. Для этого перейдите туда, где первая запись начинается ровно до 88-го. запятую (включая слово после 87-й запятой [,]) и введите [CRLF] вручную, нажав клавишу возврата. Теперь есть две строки: заголовок и записи.

-3- теперь найди все [,~~] и заменить на [,\r\n] Результат - одна запись на строку.

-4- удалить оставшуюся [~~] находку: ~~ и заменить на: [ ] пространство. Файл теперь очищен от нежелательных [CRLF].

-5- Сохраните файл и используйте его по назначению.

Может быть, сделать это в три шага (при условии, что у вас есть 88 полей в CSV, потому что вы сказали, что до 23 запятых и 65 после каждой секунды ")

Шаг 1: замените все символы CR/LF на символы, которых нет в файле, например ~

Поиск: \r\n Заменить: ~

Шаг 2: заменить все ~ после каждой 88-й "запятой группы" (или сколько угодно полей в CSV) с \r\n - чтобы заново вставить необходимые разрывы строк CSV:

Поиск: ((?:[^,]*?,){88})~ Заменить: $1\r\n

Шаг 3: заменить все остальные ~ с пространством

Поиск ~ Заменить: <space>

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