Notepad ++ - Removendo a primeira coluna em um arquivo separado por vírgula

14

Eu tenho um arquivo CSV grande que preciso remover a primeira coluna de dados. Não consigo abri-lo no Excel porque o Excel converte alguns dos valores nas colunas em números científicos.

Estou usando o Notepad ++ e estou tentando definir a primeira coluna do arquivo EXE,

1,Value1,value2,value3,value4,value5
3445,Value1,value2,value3,value4,value5
12345,Value1,value2,value3,value4,value5
1234,Value1,value2,value3,value4,value5
11,Value1,value2,value3,value4,value5

se parecer

Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
MikeD
fonte

Respostas:

13

A pesquisa e substituição do Notepad ++ oferecem suporte a expressões regulares (regex) que podem ser facilmente usadas para isso.

Use o seguinte regex para procurar:

^[^,]+,(.+)

Isso corresponde ao início da linha seguido pelo maior número de caracteres possível, não sendo uma vírgula seguida por uma vírgula seguida pelo restante da linha. O restante da linha é agrupado como primeira sub-correspondência.

Substitua globalmente por:

\1

Isso denota a primeira sub-correspondência (restante da linha). Por isso, cada linha é substituída por tudo após a primeira coluna e vírgula.

Depois de encontrar a maneira acima de fazer isso em uma única substituição global (e atualizar minha resposta de acordo), notei que essa resposta é basicamente idêntica, mas também fornece uma explicação abrangente do regex usado.


Nota: O regex menor ^[^,]+,não pode ser usado para substituição global por uma sequência vazia, pois o Notepad ++ substituirá todas as colunas, exceto a última: depois de substituir a primeira coluna, a segunda coluna (que agora é a primeira e corresponde exatamente à regex) ser substituído, depois o terceiro e assim por diante. No entanto, o menor regex funciona perfeitamente com outros editores (por exemplo, com PSPad ou vim ).

speakr
fonte
Este é o caminho a percorrer aqui. Se o OP já tiver N ++, essa é a maneira mais rápida. Eu faço muito isso com o PSPad (que poderia fazer isso de uma só vez, aliás). Também confira como o regex funciona: rubular.com/r/OiehkBT0vA
simbabque
O Notepad ++ não processa a entrada linha por linha, mas caractere por caractere. Isso tem algumas vantagens interessantes (como padrões de várias linhas).
Dennis
+1 para a edição. Infelizmente, sua resposta é wiki da comunidade agora.
Dennis
@ Dennis Sim, editei com muita frequência, pois não conhecia o limite de 10 edições.
Speakr
Por que não ^[^,]+,e substitua por vazio?
knittl
10

Pressione Ctrl+ He execute a seguinte substituição:

Find what:          .*?,(.*)
Replace with:       \1
Wrap around:        checked
Regular expression: selected
. matches newline:  unchecked

Agora pressione Alt+ Apara substituir todas as ocorrências.

Como funciona

  • A expressão regular .*?,(.*) corresponde a uma linha inteira:

    • .*?, corresponde a tudo antes da primeira vírgula, incluindo a própria vírgula.

      .*significa qualquer número de ocorrências de qualquer caractere, e o ponto de interrogação torna o quantificador preguiçoso , ou seja, corresponde ao mínimo de caracteres possível.

    • (.*) corresponde a tudo após a primeira vírgula.

      A inclusão .*de parênteses o converte em um subpadrão, para que o mastro possa ser acessado no campo de substituição.

  • \1representa a primeira sub-correspondência (corresponde a (.*)).

    Como resultado, o Notepad ++ substitui a linha por tudo o que segue a primeira vírgula.

Dennis
fonte
Só tive a mesma idéia depois de perceber que a ^[^,]+,substituição global por uma string vazia não funcionará no Notepad ++. (+1)
speakr
6

No Windows, você pode fazer o seguinte.

for /F "tokens=2,3,4,5,6 delims=," %i in (Input.csv) do @echo %i,%j,%k,%l,%m  >> output.csv

Eu assumi que você tem apenas 6 colunas. Se você tiver muito mais colunas, experimente * no campo de tokens. A idéia é retirada do Windows para comando

Sriniv
fonte
2
para um número arbitrário de colunas, use o seguinte:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC 3/12/12
3

Supondo que você tenha um sistema linux ou algum ambiente no estilo unix (eu gosto do gow , ou você pode tirar os utilitários do unixutils ), acredito que a execução do arquivo cut -d , -f2-6deve fazer o truque - deve, se bem me lembro, o truque - -ddefine o delimitador e f2-6imprime o segundo ao sexto caractere.

cat input.csv | cut -d , -f2-6 > output.csvfaria o truque ao pegar o arquivo de entrada e expulsar um arquivo de saída. Não está usando o bloco de notas, mas é rápido e muito simples.

Journeyman Geek
fonte
Obrigado, apenas cliquei no link e recebi um erro 403?
MikeD
os dois links funcionam para mim - o que é estranho. Eu costumo encontrar gow pesquisando no google - está em um repositório no github pertencente a bmatzelle. Cygwin também pode ser uma opção, mas é um exagero para esse tipo de coisa
Journeyman Geek
2

Você deve poder carregar o CSV no Excel e tratar os números como texto (impedindo a conversão para números científicos).

  1. Abra o Excel
  2. Guia Dados
  3. Do texto
  4. Escolha Delimitado
  5. Escolha Outro: ","
  6. Para todas as colunas, selecione-as na janela Visualização de dados e escolha Texto.
  7. Remova sua coluna
  8. Salvar como CSV
James Wood
fonte
Editar e salvar arquivos CSV no Excel geralmente quebra números como códigos EAN e carros alegóricos no estilo americano no Excel europeu. Mesmo se você configurar tudo ao importar, isso acaba consumindo algumas coisas. Não posso recomendar, embora provavelmente funcione. Em um ambiente produtivo, aconselho contra isso.
Simboloque 3/08/12
Isso funcionou muito bem! Thnak you
MikeD
@simbabque Eu diria que é um pouco injusto, eu o usei com sucesso em ambientes de produção para grandes conjuntos de dados que exigiam manipulação - é certo que às vezes era um pesadelo. O Excel tem o hábito de alterar dados de maneiras inesperadas, mas eu não diria que esse risco foi especialmente maior do que outras abordagens.
James Wood
Também uso ocasionalmente, mas na maioria das vezes não gosto de fazê-lo. Geralmente, é muito mais rápido usar um editor de texto que suporte a pesquisa e substituição de expressões regulares, se alguém souber como lidar com isso. Sem ofensas, porém, como sua resposta foi clara e concisa.
simbabque 5/08/12
oi não estava se ofendendo: D
James Wood
1

O Notepad ++ possui edição de coluna integrada e comando Line Up by (,) (plugin TextFX), fornecendo uma solução gráfica de apontar e clicar que provavelmente será a primeira vez que você está certo. Isso evita a necessidade de usar expressões regulares ou programação de shell, que normalmente exigem alguma depuração até que façam exatamente o que você deseja e nada mais.

Ponto de partida : arquivo CSV com colunas desalinhadas, portanto, não é fácil editar por coluna ...

    1,Value1,value2,value3,value4,value5
    3445,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234,Value1,value2,value3,value4,value5
    11,Value1,value2,value3,value4,value5
    ...

Procedimento:

  1. Selecione as linhas de interesse - talvez o arquivo inteiro.

  2. Use o comando de menu TextFX> TextFX Edit> Alinhar várias linhas por vírgula (,) Isso alinha todas as linhas por coluna e facilita a edição de colunas.

    1    ,Value1,value2,value3,value4,value5
    3445 ,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234 ,Value1,value2,value3,value4,value5
    11   ,Value1,value2,value3,value4,value5
    
  3. Entre no Modo de coluna na coluna após a primeira vírgula (,) Para um pequeno número de linhas, use os comandos do teclado: Alt + Shift + Seta para baixo.
    Se precisar trabalhar em muitas linhas (arquivo grande), use Alt + mouse e clique na coluna desejada da primeira linha, depois vá para a última linha do arquivo e Alt + Shift + clique na mesma posição da coluna. Isso ativa o modo de coluna no arquivo INTEIRO - você deve ver uma linha vertical atrás de todas as vírgulas.

  4. Excluir no modo de coluna remove uma coluna inteira de caracteres. Portanto, você pode excluir tudo antes da primeira vírgula em todas as linhas ao mesmo tempo para obter:

    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    

Feito!

Comentários sobre esta solução em comparação com as várias outras sugeridas até agora:

A edição do Modo de coluna é bastante poderosa e, quando combinada às opções de plug-in do TextFX, aplica-se a várias situações de maneira rápida e fácil.

Por exemplo, se você decidiu excluir a 2ª coluna ou a Nésima coluna rapidamente, essa abordagem funcionará quase sem modificações.

Expressões regulares, scripts de shell, por outro lado, atingirão o objetivo, sim, mas em problemas complicados você passará mais tempo "corrigindo" sua sintaxe.

A versátil funcionalidade interna do Notepad ++ é um dos seus principais pontos fortes: você obtém bastante poder sem precisar recorrer à "programação".

Assad Ebrahim
fonte
0

Se você conhece o plug-in do console Python para o Notepad ++, posso aconselhá-lo sobre outro método. Você precisa adicionar seu texto no documento do Notepad ++ e executar o próximo script no console:

res = []
data = editor.getText().split('\r\n')
for i in data:
    res.append(i.split(',')[1:])

for i in res:
    editor.addText(', '.join(i)+'\r\n')

Este script adicionou o texto do resultado ao seu documento atual do Notepad ++.

Ishikawa Yoshi
fonte
-1

Execute vim(no modo de comando, se não, pressione Escape).

Digite o seguinte comando para mapear a ação de remover a primeira coluna da qchave:

:map q 0df,j0

Que significa:

  • 0 - vá para o início da linha
  • df,- d elete tudo até , caracteres (incluindo vírgulas),
  • j - desça uma linha
  • 0 - vá para o início da linha

Em seguida, aplique esta ação a todas as linhas:

:0,$ normal q

O que significa que execute a ação atribuída à chave qda linha do início (0) ao final ($).

kenorb
fonte
Por que não fazer apenas uma substituição global por :%s/^[^,]\+,//g ?
Speakr
Você poderia também, este é fácil de usar e entender, em vez de regex :) Normalmente, sempre fico confuso sobre qual caractere devo escapar, por isso estou digitando o mesmo regex várias vezes.
Kenorb 3/08