Notepad ++ - Usuwanie pierwszej kolumny z pliku oddzielonego przecinkami

14

Mam duży plik CSV , który muszę usunąć pierwszą kolumnę danych. Nie mogę go otworzyć w programie Excel, ponieważ program Excel konwertuje niektóre wartości w kolumnach na liczby naukowe.

Używam Notepad ++ i próbuję napisać pierwszą kolumnę z pliku 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

wygladać jak

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
źródło

Odpowiedzi:

13

Wyszukiwanie i zamiana Notepad ++ obsługuje wyrażenia regularne (regex), których można w tym celu łatwo użyć.

Użyj następującego wyrażenia regularnego, aby wyszukać:

^[^,]+,(.+)

Odpowiada to początkowi wiersza, po którym następuje jak najwięcej znaków, nie będących przecinkiem, po którym następuje przecinek, a po nim reszta wiersza. Reszta wiersza jest zgrupowana jako pierwsze przesłanie.

Globalnie zastąp to:

\1

Oznacza to pierwszy wpis (reszta wiersza). Przez to każdy wiersz jest zastępowany przez wszystko po pierwszej kolumnie i przecinku.

Po tym, jak znalazłem powyższy sposób, aby to zrobić w jednym globalnym zamienniku (i odpowiednio zaktualizowałem swoją odpowiedź), zauważyłem, że ta odpowiedź jest w zasadzie identyczna, ale także wyczerpujące wyjaśnienie zastosowanego wyrażenia regularnego.


Uwaga: krótszego wyrażenia regularnego ^[^,]+,nie można użyć do globalnego zastąpienia pustym łańcuchem, ponieważ Notepad ++ zastąpi wszystkie kolumny oprócz ostatniej: Po zastąpieniu pierwszej kolumny druga kolumna (która teraz jest pierwsza i pasuje dokładnie do wyrażenia regularnego) będzie zostać zastąpiony, a następnie trzeci i tak dalej. Jednak krótszy regex działa doskonale z innymi edytorami (np. PSPad lub vim ).

mówca
źródło
To jest droga, aby przejść tutaj. Jeśli OP ma już N ++, jest to najszybszy sposób. I to zrobić dużo z PSPad (co może zrobić to za jednym zamachem, btw). Sprawdź także, jak działa regex: rubular.com/r/OiehkBT0vA
simbabque
Notepad ++ nie przetwarza danych wejściowych wiersz po wierszu, ale znak po znaku. Ma to pewne fajne zalety (takie jak wzory wieloliniowe).
Dennis
+1 za edycję. Niestety twoją odpowiedzią jest teraz wiki społeczności.
Dennis
@Dennis Tak, edytowałem zbyt często, ponieważ nie byłem świadomy limitu 10 edycji.
przemówienie
Dlaczego nie ^[^,]+,i zastąpić pustym?
knittl
10

Naciśnij Ctrl+ Hi wykonaj następujące zastąpienie:

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

Teraz naciśnij Alt+, Aaby zastąpić wszystkie wystąpienia.

Jak to działa

  • Wyrażenie regularne .*?,(.*) dopasowuje cały wiersz:

    • .*?, dopasowuje wszystko przed pierwszym przecinkiem, łącznie z samym przecinkiem.

      .*oznacza dowolną liczbę wystąpień dowolnego znaku, a znak zapytania powoduje, że kwantyfikator jest leniwy , tzn. dopasowuje jak najmniej znaków.

    • (.*) dopasowuje wszystko po pierwszym przecinku.

      Zamknięcie .*w nawiasach przekształca go w wzór pomocniczy, aby można było uzyskać dostęp do masztu w polu zamiany.

  • \1reprezentuje pierwsze przesłanie (dopasowanie dla (.*)).

    W rezultacie Notepad ++ zamienia wiersz na wszystko, co następuje po pierwszym przecinku.

Dennis
źródło
Właśnie wpadłem na ten sam pomysł, gdy zauważyłem, że ^[^,]+,globalnie zastąpiony pustym ciągiem nie będzie działał w Notepad ++. (+1)
przemawiający
6

W systemie Windows możesz to zrobić w następujący sposób.

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

Zakładałem, że masz tylko 6 kolumn. Jeśli masz dużo więcej kolumn, spróbuj eksperymentować z * w polu tokenów. Pomysł pochodzi z systemu Windows na polecenie

Sriniv
źródło
2
dla dowolnej liczby kolumn, użyj tego:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC
3

Zakładając, że masz system linuksowy lub środowisko w stylu uniksowym (lubię gow , lub możesz oderwać narzędzia od unixutils ) Wierzę, że uruchomienie pliku cut -d , -f2-6powinno załatwić sprawę - powinno, jeśli przywołam poprawnie, zrobi lewę - -dustawia deliminator i f2-6drukuje znaki od drugiej do szóstej.

cat input.csv | cut -d , -f2-6 > output.csvzrobiłby lewę biorąc plik wejściowy i wykopując plik wyjściowy. Nie używa notatnika, ale jest szybki i bardzo prosty.

Journeyman Geek
źródło
Dzięki, właśnie kliknąłem link i otrzymałem błąd 403?
MikeD,
oba linki działają dla mnie - co jest dziwne. Zwykle znajduję gow, szukając go w Google - to na repozytorium github należącym do bmatzelle. Cygwin może być również opcją, ale jest to przesada dla tego rodzaju rzeczy
Journeyman Geek
2

Powinieneś być w stanie załadować CSV do programu Excel i traktować liczby jako tekst (zapobiegając konwersji na liczby naukowe).

  1. Otwórz program Excel
  2. Karta danych
  3. Z tekstu
  4. Wybierz opcję Rozdzielane
  5. Wybierz Inne: „”
  6. Dla wszystkich kolumn wybierz je w oknie Podgląd danych i wybierz Tekst
  7. Usuń swoją kolumnę
  8. Zapisz jako CSV
James Wood
źródło
Edytowanie i zapisywanie plików CSV w programie Excel często psuje liczby, takie jak kody EAN i zmiennoprzecinkowe znaki amerykańskie w programie Excel. Nawet jeśli wszystko skonfigurujesz podczas importowania, zdarza się, że zjadasz niektóre rzeczy. Nie mogę tego polecić, ale prawdopodobnie zadziałałoby. W produktywnym środowisku odradzam to.
simbabque
To działało świetnie! Dziękuję
MikeD
@simbabque Powiedziałbym, że to trochę niesprawiedliwe, z powodzeniem wykorzystałem je w środowiskach produkcyjnych dla dużych zestawów danych, które wymagały manipulacji - co prawda czasami był to koszmar. Excel ma zwyczaj modyfikowania danych w nieoczekiwany sposób, ale nie powiedziałbym, że to ryzyko było szczególnie większe niż w przypadku innych metod.
James Wood,
Używam go też czasami, ale przez większość czasu nie lubię tego robić. Często korzystanie z edytora tekstu obsługującego wyszukiwanie wyrażeń regularnych i zastępowanie jest znacznie szybsze, jeśli ktoś wie, jak sobie z tym poradzić. Bez obrazy, ponieważ odpowiedź była jasna i zwięzła.
simbabque
oi się nie obraził: D
James Wood,
1

Notepad ++ ma wbudowaną edycję kolumn i polecenie Line Up by (,) (wtyczka TextFX), dając graficzne rozwiązanie typu „wskaż i kliknij”, które prawdopodobnie będzie po raz pierwszy właściwe. Pozwala to uniknąć konieczności używania wyrażeń regularnych lub programowania powłoki, które zwykle wymagają debugowania, dopóki nie zrobią dokładnie tego, co chcesz i nic więcej.

Punkt początkowy : plik CSV z kolumnami źle wyrównany, więc nie jest łatwy do edycji według kolumn ...

    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. Wybierz interesujące Cię rzędy - być może cały plik.

  2. Użyj polecenia menu TextFX> Edycja TextFX> Ustaw wiele linii przecinkiem (,) To wyrównuje wszystkie wiersze według kolumn i ułatwia edycję kolumn.

    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. Wejdź do trybu kolumny w kolumnie po pierwszym przecinku (,) W przypadku niewielkiej liczby wierszy użyj poleceń klawiaturowych: Alt + Shift + Strzałka w dół.
    Jeśli chcesz pracować na wielu wierszach (duży plik), użyj Alt + mysz i kliknij żądaną kolumnę pierwszego wiersza, a następnie przejdź do ostatniego wiersza pliku i Alt + Shift + kliknij tę samą pozycję kolumny. Aktywuje to tryb kolumnowy w pliku CAŁOŚĆ - za wszystkimi przecinkami powinna być widoczna pionowa linia.

  4. Usuń w trybie kolumny usuwa całą kolumnę znaków. Możesz więc usunąć wszystko przed pierwszym przecinkiem we wszystkich wierszach jednocześnie, aby uzyskać:

    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
    

Gotowy!

Uwaga na temat tego rozwiązania w porównaniu z innymi sugerowanymi dotychczas:

Edycja w trybie kolumnowym jest dość wydajna i, w połączeniu z opcjami wtyczki TextFX, ma zastosowanie do różnych sytuacji w szybki i szybki sposób.

Na przykład, jeśli zdecydowałeś się szybko usunąć 2. kolumnę lub N-tą kolumnę, to podejście działa prawie bez modyfikacji.

Z drugiej strony wyrażenia regularne, skrypty powłoki osiągną cel, tak, ale w skomplikowanych problemach poświęcisz więcej czasu na „usuwanie błędów” ze składni.

Wszechstronna wbudowana funkcjonalność Notepad ++ jest jedną z jego głównych zalet: zyskujesz całkiem sporo mocy bez konieczności uciekania się do „programowania”.

Assad Ebrahim
źródło
0

Jeśli znasz wtyczkę konsoli Python dla Notepad ++, mogę doradzić Ci inną metodę. Musisz dodać tekst do dokumentu Notepad ++ i wykonać następny skrypt w konsoli:

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')

Ten skrypt dodał tekst wynikowy do bieżącego dokumentu Notepad ++.

Ishikawa Yoshi
źródło
-1

Uruchom vim(w trybie poleceń, jeśli nie, naciśnij Escape).

Wpisz następujące polecenie, aby zmapować akcję usuwania pierwszej kolumny do qklucza:

:map q 0df,j0

Co znaczy:

  • 0 - przejdź na początek linii
  • df,- d elete wszystko do , znak (w tym przecinek),
  • j - idź w dół o jedną linię
  • 0 - przejdź na początek linii

Następnie zastosuj tę akcję do wszystkich linii:

:0,$ normal q

Co oznacza, uruchom akcję przypisaną do klucza qod linii od początku (0) do końca ($).

kenorb
źródło
Dlaczego nie zrobić tylko jednego globalnego zamiennika :%s/^[^,]\+,//g?
przemówienie
Mógłbyś również, ten jest łatwy w użyciu i zrozumienie zamiast wyrażenia regularnego :) Zazwyczaj zawsze jestem zdezorientowany, którą postać muszę uciec, więc kończę wpisywanie tego samego wyrażenia regularnego wiele razy.
kenorb