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 строки. Регулярное выражение ^[^|]*$ выберет все три строки после строки Аллена, так как это ищет строки без труб вообще.

1 ответ1

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]*$)
Проверьте это здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .