Regex в Notepad ++, чтобы найти строки без ровно 9 каналов

1

У меня есть CSV, который мне нужно очистить, прежде чем читать его в таблицу. Это разделенная трубами структура из 10 колонн. Проблема в том, что в некоторых записях 9-й столбец содержит возврат каретки. Мне нужно заменить эти экземпляры CRLF строкой символов (в качестве заполнителей), например # $%, но мне нужно только заменить CRLF, которые находятся в 9-м столбце, для каждой записи .

Итак, в этом примере:

Susan|Ward    |1     |1          |1     |1     |0     |||3250905     
Allen|Doe|4     |1          |1     |1     |0     ||
some text
text
more text in the same column|3250061     
Mary|James|4     |1          |1     |1     |0     |||3250061     Albert|Nordling|1     |1          |1     |0     |0     |||900434      
Henry|Johnson|1     |1          |1     |0     |0     |||900434      
Tony|Anderson    |1     |1          |1     |1     |0     |||3250905     

У всех записей Сьюзен, Генри и Тони есть 9 каналов, но у Аллена есть экземпляры CRLF (в Notepad ++), которые необходимо заменить, чтобы «вытянуть» их все на одну и ту же строку, чтобы получить эту запись на одной строке.

Кроме того, записи Мэри и Альберта находятся в одной строке вместе. Я должен быть в состоянии найти их, чтобы разделить их.

Таким образом, регулярное выражение для поиска линий, которые не имеют ровно 9 каналов, сделало бы свое дело.

Я могу найти записи с 9-м столбцом в нескольких строках с помощью этого регулярного выражения:

^[^|]*$

Но я не могу понять, как найти все строки, которые не имеют 9 каналов (10 столбцов). Это не сработает:

^[^|{9}]*$

Что бы это сделать?

Один конкретный момент: если это вообще возможно, мне нужно, чтобы поиск позволял выделить целый блок строк (который будет каждой записью), который не имеет 9 каналов. Так что в моем примере строка, которая начинается с Аллена, поиск в Notepad ++ выделит эту строку и следующие 3 строки. Регулярное выражение ^[^|]*$выберет все три строки после линии Аллена, так как это ищет линии без труб вообще.

Marky
источник

Ответы:

3

Вы можете использовать это выражение для сопоставления строк ровно с 10 столбцами:
^([^|\n]*\|){9}[^|\n]*$
вы можете проверить его здесь

Где:

  • ^ ... $ совпадение начала и конца строки
  • [^|\n]* соответствует содержимому столбца (без | и без новой строки; может даже быть пустым)
  • \| соответствует трубе (необходимо экранировать

Соответствующие строки с менее чем девятью столбцами:
^([^|\n]*\|){0,8}[^|\n]*$

Соответствующие строки с менее чем девятью столбцами:
^([^|\n]*\|){10,1000}[^|\n]*$

Обновить

Поэкспериментируя немного, кажется, это работает, чтобы найти строки с не совсем 10 столбцами (9 |):
(^([^|\r\n]*\|){0,8}[^|\r\n]*$)|(^([^|\r\n]*\|){10,1000}[^|\r\n]*$)
протестируйте здесь

Мате Юхас
источник
Извините, если мне неясно в моем объяснении - мне нужно найти строки, которые не имеют ровно 9 каналов (10 столбцов) - имеют ли они 9 или менее или 11 или более столбцов - могу ли я сделать это в одном регулярном выражении? Так что на самом деле мне нужно противоположное тому, что делает ваш первый регулярный
оператор
Объединение их не сработало - оно подсвечивало каждый последующий ряд каждый раз, когда я нажимал «Найти следующий».
Marky
Пожалуйста, посмотрите мое обновление, оно работает сейчас.
Máté Juhász
Это действительно работает для выбора каждой отдельной строки, которая не имеет 9 каналов. Одно из регулярных выражений, которое я попробовал (в своем посте), выделяет весь раздел, в котором вообще нет каналов. Можно ли заставить вас сделать то же самое, чтобы выбрать всю запись? Таким образом, в моем примере Аллен Доу и следующие три строки будут выбраны при поиске. Возможно?
Марки