Blocco note ++: rimozione della prima colonna in un file separato da virgola


14

Ho un grande file CSV di cui ho bisogno per rimuovere la prima colonna di dati. Non riesco ad aprirlo in Excel perché Excel converte alcuni dei valori nelle colonne in numeri scientifici.

Sto usando Notepad ++ e sto provando a mettere insieme la prima colonna dal file 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

assomigliare

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

Risposte:


13

La ricerca e la sostituzione di Notepad ++ supporta espressioni regolari (regex) che possono essere facilmente utilizzate per questo.

Utilizzare la seguente regex per cercare:

^[^,]+,(.+)

Questo corrisponde all'inizio della riga seguito dal maggior numero possibile di caratteri che non sono una virgola seguita da una virgola seguita dal resto della riga. Il resto della riga è raggruppato come primo invio.

Sostituisci globalmente con questo:

\1

Questo indica il primo invio (resto della linea). Da ciò ogni riga è sostituita da tutto dopo la prima colonna e virgola.

Dopo aver trovato il modo sopra descritto per farlo in una singola sostituzione globale (e aggiornato di conseguenza la mia risposta), ho notato che questa risposta è sostanzialmente identica ma fornisce anche una spiegazione completa del regex utilizzato.


Nota: il regex più corto ^[^,]+,non può essere utilizzato per la sostituzione globale con una stringa vuota poiché Notepad ++ sostituirà quindi tutte le colonne tranne l'ultima: dopo aver sostituito la prima colonna, la seconda colonna (che ora è la prima e corrisponde esattamente alla regex) essere sostituito, quindi il terzo e così via. Tuttavia, il regex più corto funziona perfettamente con altri editor (ad es. Con PSPad o vim ).


Questo è il modo di andare qui. Se l'OP ha già N ++ questo è il modo più rapido. Lo faccio molto con PSPad (che potrebbe farlo in un colpo solo, a proposito). Scopri anche come funziona il regex: rubular.com/r/OiehkBT0vA
simbabque

Notepad ++ non elabora l'input riga per riga, ma carattere per carattere. Ciò ha alcuni vantaggi chiari (come i modelli multilinea).
Dennis,

+1 per la modifica. Purtroppo, la tua risposta è wiki comunità ora.
Dennis,

@Dennis Sì, ho modificato troppo spesso poiché non ero a conoscenza del limite di 10 modifiche.
speakr

Perché no ^[^,]+,e sostituirlo con vuoto?
Knittl

10

Premi Ctrl+ Hed esegui la seguente sostituzione:

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

Ora premi Alt+ Aper sostituire tutte le occorrenze.

Come funziona

  • L' espressione regolare .*?,(.*) corrisponde a un'intera riga:

    • .*?, corrisponde a tutto prima della prima virgola, inclusa la virgola stessa.

      .*indica un numero qualsiasi di occorrenze di qualsiasi personaggio e il punto interrogativo rende pigro il quantificatore , ovvero corrisponde al minor numero possibile di caratteri.

    • (.*) corrisponde a tutto dopo la prima virgola.

      Racchiudere .*tra parentesi lo converte in un sottotatro, quindi è possibile accedere all'albero nel campo di sostituzione.

  • \1rappresenta il primo invio (corrispondenza per (.*)).

    Di conseguenza, Notepad ++ sostituisce la riga con tutto ciò che segue la prima virgola.


Ho appena avuto la stessa idea dopo aver notato che la ^[^,]+,sostituzione globale con una stringa vuota non funzionerà in Notepad ++. (+1)
speakr

6

In Windows, puoi farlo come segue.

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

Presumo che tu abbia solo 6 colonne. Se hai molte più colonne, prova a sperimentare con * nel campo token. L'idea è presa da Windows per il comando


2
per un numero arbitrario di colonne, utilizzare questo:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC

3

Supponendo che tu abbia un sistema linux o un ambiente in stile unix (mi piace gow , o puoi snarf le utility da unixutils ) credo che eseguire il file attraverso cut -d , -f2-6dovrebbe fare il trucco - dovrebbe, se ricordo bene farà il trucco - -dimposta il deliminatore e f2-6stampa dal secondo al sesto carattere.

cat input.csv | cut -d , -f2-6 > output.csvfarebbe il trucco prendendo il file di input e buttando fuori un file di output. Non sta usando il blocco note, ma è veloce e molto semplice.


Grazie, ho appena cliccato sul link e ho ricevuto un errore 403?
MikeD,

entrambi i collegamenti funzionano per me, il che è strano. Di solito trovo gow cercando su Google - è su un repo github appartenente a bmatzelle. Cygwin potrebbe anche essere un'opzione, ma è eccessivo per questa sorta di cosa
Journeyman Geek

2

Dovresti essere in grado di caricare CSV in Excel e farlo trattare i numeri come testo (impedendogli di convertirsi in numeri scientifici).

  1. Apri Excel
  2. Scheda dati
  3. Dal testo
  4. Scegli Delimitato
  5. Scegli Altro: ","
  6. Per tutte le colonne, selezionale nella finestra Anteprima dati e scegli Testo
  7. Rimuovi la tua colonna
  8. Salva come CSV

La modifica e il salvataggio di file CSV in Excel spesso interrompe numeri come codici EAN e float in stile USA in Excel europeo. Anche se imposti tutto durante l'importazione, capita di mangiare alcune cose. Non posso raccomandarlo, anche se probabilmente funzionerebbe. In un ambiente produttivo, ti sconsiglio.
simbabque

Questo ha funzionato alla grande! Grazie
MikeD

@simbabque Direi che è un po 'ingiusto, l'ho usato con successo in ambienti di produzione per grandi set di dati che richiedevano manipolazione - a volte è stato un incubo. Excel ha l'abitudine di modificare i dati in modi inaspettati, ma non direi che questo rischio era particolarmente maggiore di altri approcci.
James Wood,

Lo uso anche occasionalmente, ma la maggior parte di queste volte non mi piace farlo. Spesso è molto più veloce usare un editor di testo che supporta la ricerca e la sostituzione di regex se si sa come gestirlo. Senza offesa, però, poiché la tua risposta è stata chiara e concisa.
simbabque,

oi non si stavano offendendo: D
James Wood il

1

Notepad ++ ha la modifica della colonna integrata e l'allineamento tramite il comando (,) (plug-in TextFX) che offre una soluzione grafica punta e clicca che è probabilmente la prima volta giusta. Questo evita di dover usare espressioni regolari o la programmazione della shell, che in genere richiedono un po 'di debug fino a quando non fanno esattamente quello che vuoi e niente di più.

Punto di partenza : file CSV con colonne disallineate, quindi non facile da modificare per colonna ...

    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
    ...

Procedura:

  1. Seleziona le righe di interesse, forse l'intero file.

  2. Usa il comando di menu TextFX> Modifica TextFX> Allinea più righe per virgola (,) Allinea tutte le righe per colonna e semplifica la modifica delle colonne.

    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. Inserire la modalità colonna nella colonna dopo la prima virgola (,) Per un numero limitato di righe, utilizzare i comandi da tastiera: Alt + Maiusc + Freccia giù.
    Se hai bisogno di lavorare su più righe (file di grandi dimensioni), usa Alt + mouse e fai clic sulla colonna desiderata della prima riga, quindi passa all'ultima riga del file e Alt + Maiusc + clic sulla stessa posizione della colonna. Questo attiva la modalità colonna sul file INTERO - dovresti vedere una linea verticale dietro tutte le virgole.

  4. Elimina in modalità colonna rimuove un'intera colonna di caratteri. Quindi puoi eliminare tutto prima della prima virgola in tutte le righe contemporaneamente per ottenere:

    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
    

Fatto!

Osservare questa soluzione rispetto alle altre suggerite finora:

La modifica della modalità colonna è piuttosto potente e, se combinata con le opzioni del plug-in TextFX, si applica a una varietà di situazioni in modo rapido e preciso.

Ad esempio, se si è deciso di eliminare rapidamente la seconda colonna o l'ennesima colonna, questo approccio funziona quasi senza modifiche.

Espressioni regolari, script di shell, d'altra parte, raggiungeranno l'obiettivo, sì, ma in problemi complicati passerai più tempo a "decodificare" la tua sintassi.

La versatile funzionalità integrata di Notepad ++ è uno dei suoi principali punti di forza: ottieni un bel po 'di potenza senza dover ricorrere alla "programmazione".


0

Se hai familiarità con il plug-in della console Python per Notepad ++, posso consigliarti un altro metodo. Devi aggiungere il tuo testo sul documento Notepad ++ ed eseguire lo script successivo nella 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')

Questo script ha aggiunto il testo del risultato al documento Notepad ++ corrente.


-1

Esegui vim(in modalità comando, in caso contrario premere Esc).

Digitare il comando seguente per mappare l'azione di rimozione della prima colonna sulla qchiave:

:map q 0df,j0

Che significa:

  • 0 - vai all'inizio della riga
  • df,- d elete tutto fino , caratteri (compresi virgola),
  • j - Scendi di una riga
  • 0 - vai all'inizio della riga

Quindi applicare questa azione a tutte le linee:

:0,$ normal q

Ciò significa che esegui l'azione assegnata alla chiave qdalla riga dall'inizio (0) alla fine ($).


Perché non fare semplicemente un singolo sostituto globale con :%s/^[^,]\+,//g?
speakr

Potresti anche, questo è facile da usare e da capire piuttosto che regex :) Di solito sono sempre confuso su quale personaggio devo scappare, quindi finisco di scrivere lo stesso regex molte volte.
Kenorb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.