Regex no Notepad ++ para localizar linhas sem exatamente 9 pipes

1

Eu tenho um CSV que preciso limpar antes de lê-lo em uma tabela. É uma estrutura de 10 colunas, delimitada por canos. O desafio é que, em alguns registros, a 9ª coluna tem retornos de carro. Eu preciso substituir essas instâncias CRLF com uma string de símbolos (como placeholders), como # $%, mas eu só preciso substituir os CRLFs que estão dentro da 9ª coluna, para cada registro . / p>

Então, neste exemplo:

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     

Os registros de Susan, Henry e Tony têm 9 canais, mas Allen tem instâncias de CRLFs (no Notepad ++) que precisam ser substituídas para "puxar" todas para a mesma linha para obter esse registro em uma linha.

Além disso, os registros de Mary e Albert estão juntos em uma linha. Eu preciso ser capaz de encontrá-los também para que eu possa dividi-los.

Assim, um regex para encontrar linhas que não tenham exatamente 9 canais faria o truque.

Eu posso encontrar os registros com a 9ª coluna em várias linhas com este regex:

^[^|]*$

Mas não consigo descobrir como encontrar todas linhas que não possuem 9 canais (10 colunas). Isso não funcionará:

^[^|{9}]*$

O que faria isso?

Um ponto específico: Se for possível, preciso que a pesquisa selecione um bloco inteiro de linhas (que seriam cada registro) que não tenham 9 canais. Então, no meu exemplo, a linha que começa com Allen, uma pesquisa no Notepad ++, destacaria essa linha e as três linhas seguintes. O regex ^[^|]*$ selecionaria todas as três linhas após a linha Allen, já que está procurando linhas sem tubos.

    
por marky 17.02.2017 / 15:20

1 resposta

3

Você pode usar essa expressão para corresponder linhas com exatamente 10 colunas:
^([^|\n]*\|){9}[^|\n]*$
Você pode testá-lo aqui

Onde:

  • ^ ... $ corresponde ao início e ao final de uma linha
  • [^|\n]* corresponde ao conteúdo de uma coluna (sem | e sem nova linha; pode até estar vazio)
  • \| corresponde ao canal (precisa ser escapado

Correspondência de linhas com menos de nove colunas:
^([^|\n]*\|){0,8}[^|\n]*$

Correspondência de linhas com menos de nove colunas:
^([^|\n]*\|){10,1000}[^|\n]*$

Atualizar

Brincando um pouco, parece funcionar para encontrar linhas com não exatamente 10 colunas (9 | ):
(^([^|\r\n]*\|){0,8}[^|\r\n]*$)|(^([^|\r\n]*\|){10,1000}[^|\r\n]*$)
Teste-o aqui

    
por 17.02.2017 / 15:37