No Notepad ++, como substituir texto entre dois delimitadores em várias linhas

1

Um arquivo delimitado por vírgulas é criado ao exportar os contatos do Google para o que eles chamam de "formato CSV do Google (para importação em uma conta do Google)". O problema é que este formato manipula anotações em várias linhas, inserindo o texto entre aspas e permitindo que o CRLF com essas citações.

Em outras palavras, imagine um registro com Nome, Nota, E-mail quando houver uma anotação de várias linhas exibida da seguinte maneira no arquivo .csv:

Nome, "Nota Primeira Linha \ r \ n

SecondNoteLine \ r \ n

Lastnoteline ", email.addr @ domain.net \ r \ n

O mesmo registro sem o campo de nota aparece da seguinte maneira e está em uma única linha (Mais padrão):

Nome , email.addr @ domain.net \ r \ n

Estou tentando formar a expressão regex correta e tentei extraí-la Como usar expressões regulares no Notepad ++ (tutorial) sem sucesso.

O mais próximo que eu cheguei (não muito perto) é uma , \ ". *, \"

com. Nova linha de correspondência.

A expressão que estou tentando corresponder é:

"Selecione o texto entre" e ", somente quando houver um ou mais / r / n" "e substitua por NUL"

Assim, nos exemplos ablove, ambos os registros seriam idênticos e eu posso fazer com que cada registro de contato apareça em uma única linha e seja capaz de importá-lo para o excel.

Neste momento, meus olhos estão sangrando, e qualquer ajuda seria apreciada.

    
por EdinTexas 09.10.2016 / 03:37

1 resposta

2

O abaixo funcionou para mim com Notepad ++ exatamente como você explica que precisa, e com os dados de exemplo você forneceu sua pergunta também.

Luzes. . .

Câmera...

  1. Localizar:((?:^|\r\n)[^"]*+"[^\r\n"]*+)\r\n([^"]*+")
  2. Substituir por: $1 $2
  3. Certifique-se de que a opção Expressão regular esteja marcada
  4. Certifique-se de que a opção Envolva esteja marcada
  5. Pressione Replace All quantas vezes você precisar para obter os resultados finais e esperados para seus registros

Ação...

Explanation:

((?:^|\r\n)BeginatstartoffileorbeforetheCRLFbeforethestartofarecord[^"]*+         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)

Note: The *+ is a possessive quantifier. Use them appropriately to speed up execution.

Update:

This more general version of the regex will work with any line break sequence (\r\n, \r or \n):

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

Source

    
por 09.10.2016 / 04:27