Поиск регулярных выражений в 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>