Notepad ++ - Xóa cột đầu tiên trong tệp được phân tách bằng dấu phẩy


14

Tôi có một tệp CSV lớn mà tôi cần xóa cột dữ liệu đầu tiên. Tôi không thể mở nó trong Excel vì Excel chuyển đổi một số giá trị trong các cột thành số khoa học.

Tôi đang sử dụng Notepad ++ và tôi đang cố gắng xâu chuỗi cột đầu tiên từ tệp 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

để trông giống như

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

Câu trả lời:


13

Tìm kiếm và thay thế của Notepad ++ hỗ trợ các biểu thức thông thường (regex) có thể dễ dàng sử dụng cho việc này.

Sử dụng regex sau để tìm kiếm:

^[^,]+,(.+)

Điều này khớp với điểm bắt đầu của dòng theo sau là càng nhiều ký tự càng tốt, không phải là dấu phẩy theo sau là dấu phẩy theo sau là phần còn lại của dòng. Phần còn lại của dòng được nhóm lại thành tập hợp con đầu tiên.

Toàn cầu thay thế bằng điều này:

\1

Điều này biểu thị các đệ trình đầu tiên (phần còn lại của dòng). Do đó, mỗi dòng được thay thế bởi mọi thứ sau cột và dấu phẩy đầu tiên.

Sau khi tôi tìm thấy cách trên để thực hiện nó trong một thay thế toàn cầu duy nhất (và cập nhật câu trả lời của tôi cho phù hợp), tôi nhận thấy rằng câu trả lời này về cơ bản là giống hệt nhau nhưng cũng đưa ra một lời giải thích toàn diện về regex được sử dụng.


Lưu ý:^[^,]+, Không thể sử dụng regex ngắn hơn để thay thế toàn cầu bằng một chuỗi rỗng vì Notepad ++ sẽ thay thế tất cả các cột ngoại trừ cột cuối cùng: Sau khi thay thế cột đầu tiên, cột thứ hai (hiện là cột đầu tiên và khớp chính xác với regex) được thay thế, sau đó là thứ ba, và như vậy. Tuy nhiên, regex ngắn hơn hoạt động hoàn hảo với các trình soạn thảo khác (ví dụ với PSPad hoặc vim ).


Đây là cách để đi đến đây. Nếu OP đã có N ++ thì đây là cách nhanh nhất. Tôi làm điều này rất nhiều với PSPad (có thể làm điều này trong một lần, btw). Ngoài ra, hãy kiểm tra cách thức hoạt động của regex: rubular.com/r/OiehkBT0vA
simbabque

Notepad ++ không xử lý dòng đầu vào theo dòng, nhưng theo từng ký tự. Điều đó có một số lợi thế gọn gàng (như các mẫu nhiều dòng).
Dennis

+1 cho chỉnh sửa. Đáng buồn thay, câu trả lời của bạn là wiki cộng đồng bây giờ.
Dennis

@Dennis Có, tôi đã chỉnh sửa quá thường xuyên vì tôi không biết giới hạn 10 lần chỉnh sửa.
speakr

Tại sao không ^[^,]+,và thay thế bằng sản phẩm nào?
knittl

10

Nhấn Ctrl+ Hvà thực hiện thay thế sau:

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

Bây giờ nhấn Alt+ Ađể thay thế tất cả các lần xuất hiện.

Làm thế nào nó hoạt động

  • Các biểu hiện thường xuyên .*?,(.*) phù hợp với toàn bộ một dòng:

    • .*?, khớp với mọi thứ trước dấu phẩy đầu tiên, bao gồm cả dấu phẩy.

      .*có nghĩa là bất kỳ số lần xuất hiện của bất kỳ ký tự nào và dấu chấm hỏi làm cho bộ định lượng trở nên lười biếng , tức là, nó khớp với càng ít ký tự càng tốt.

    • (.*) phù hợp với mọi thứ sau dấu phẩy đầu tiên.

      Việc đóng .*dấu trong ngoặc đơn chuyển đổi nó thành một mẫu con, do đó cột có thể được truy cập trong trường thay thế.

  • \1đại diện cho đệ trình đầu tiên (phù hợp cho (.*)).

    Kết quả là, Notepad ++ thay thế dòng bằng mọi thứ theo dấu phẩy đầu tiên.


Chỉ có cùng một ý tưởng sau khi nhận thấy rằng ^[^,]+,toàn cầu được thay thế bằng một chuỗi rỗng sẽ không hoạt động trong Notepad ++. (+1)
speakr

6

Trong Windows, bạn có thể làm như sau.

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

Tôi giả sử rằng bạn chỉ có 6 cột. Nếu bạn có nhiều cột hơn, hãy thử trải nghiệm với trường * trong mã thông báo. Ý tưởng được lấy từ Windows cho lệnh


2
đối với số lượng cột tùy ý, hãy sử dụng số này:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC

3

Giả sử bạn có một hệ thống Linux hoặc một số môi trường phong cách unix (Tôi như gow , hoặc bạn có thể snarf các tiện ích tắt unixutils ) Tôi tin chạy các tập tin thông qua cut -d , -f2-6nên làm các trick - nó nên, nếu tôi nhớ chính xác sẽ làm các trick - -dđặt dấu phân cách và f2-6in ra ký tự thứ hai đến thứ 6.

cat input.csv | cut -d , -f2-6 > output.csvsẽ thực hiện thủ thuật lấy tệp đầu vào và khởi động một tệp đầu ra. Nó không sử dụng notepad, nhưng nó nhanh và thực sự đơn giản.


Cảm ơn, tôi chỉ cần nhấp vào liên kết và tôi đã gặp lỗi 403?
MikeD

cả hai liên kết làm việc cho tôi - đó là wierd. Tôi thường tìm thấy gow bằng cách googling cho nó - nó trên một repo github thuộc về bmatzelle. Cygwin cũng có thể là một lựa chọn, nhưng nó quá mức cần thiết cho thứ sắp xếp này
Journeyman Geek

2

Bạn sẽ có thể tải CSV vào excel và yêu cầu nó xử lý các số dưới dạng văn bản (ngăn không cho chuyển đổi thành số khoa học).

  1. Mở Excel
  2. Tab dữ liệu
  3. Từ văn bản
  4. Chọn giới hạn
  5. Chọn khác: ","
  6. Đối với tất cả các cột, hãy chọn chúng trong cửa sổ Xem trước Dữ liệu và chọn Văn bản
  7. Xóa cột của bạn
  8. Lưu dưới dạng CSV

Chỉnh sửa và lưu tệp CSV trong Excel thường phá vỡ các số như mã EAN và số float theo kiểu Mỹ trong Excel châu Âu. Ngay cả khi bạn thiết lập mọi thứ khi nhập, nó sẽ ăn một số thứ. Tôi không thể giới thiệu nó, mặc dù nó có thể sẽ làm việc. Trong một môi trường năng suất, tôi sẽ khuyên bạn nên chống lại nó.
simbabque

Điều này đã làm việc tuyệt vời! Thnak bạn
MikeD

@simbabque Tôi sẽ nói rằng hơi bất công, tôi đã sử dụng nó thành công trong môi trường sản xuất cho các bộ dữ liệu lớn cần thao tác - phải thừa nhận rằng đôi khi đó là một cơn ác mộng. Excel có thói quen thay đổi dữ liệu theo những cách không mong muốn, nhưng tôi không nói rằng rủi ro này đặc biệt lớn hơn các phương pháp khác.
James Wood

Đôi khi tôi cũng sử dụng nó, nhưng hầu hết những lúc này tôi không thích làm điều đó. Việc sử dụng trình soạn thảo văn bản hỗ trợ tìm kiếm & thay thế regex thường nhanh hơn rất nhiều nếu ai đó biết cách xử lý nó. Không có hành vi phạm tội, mặc dù, như câu trả lời của bạn là rõ ràng và súc tích.
simbabque

oi không phạm tội: D
James Wood

1

Notepad ++ có tính năng chỉnh sửa cột tích hợp và lệnh Line Up by (,) (plugin TextFX) đưa ra giải pháp điểm và nhấp đồ họa có khả năng là lần đầu tiên đúng. Điều này tránh việc phải sử dụng các biểu thức thông thường hoặc lập trình shell, cả hai thường yêu cầu một số gỡ lỗi cho đến khi chúng thực hiện chính xác những gì bạn muốn và không có gì hơn.

Điểm bắt đầu : Tệp CSV có các cột bị căn chỉnh, do đó không dễ chỉnh sửa theo cột ...

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

Thủ tục:

  1. Chọn các hàng quan tâm - có lẽ là toàn bộ tệp.

  2. Sử dụng lệnh menu TextFX> TextFX Chỉnh sửa> Sắp xếp nhiều dòng theo dấu phẩy (,) Điều này sắp xếp tất cả các hàng theo cột và giúp chỉnh sửa cột dễ dàng.

    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. Nhập Chế độ cột tại cột sau dấu phẩy đầu tiên (,) Đối với một số lượng nhỏ hàng, sử dụng các lệnh bàn phím: Alt + Shift + DownArrow.
    Nếu cần làm việc trên nhiều hàng (tệp lớn), sử dụng chuột Alt + và nhấp vào cột mong muốn của dòng đầu tiên , sau đó di chuyển đến dòng cuối cùng của tệp và Alt + Shift + nhấp vào cùng vị trí cột. Thao tác này kích hoạt chế độ cột trên tệp ENTIRE - bạn sẽ thấy một đường thẳng đứng phía sau tất cả các dấu phẩy.

  4. Xóa trong chế độ cột sẽ xóa toàn bộ cột ký tự. Vì vậy, bạn có thể xóa mọi thứ trước dấu phẩy đầu tiên trong tất cả các hàng cùng một lúc để có được:

    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
    

Làm xong!

Nhận xét về giải pháp này so với các giải pháp khác được đề xuất cho đến nay:

Chỉnh sửa Chế độ Cột khá mạnh mẽ và, khi được kết hợp với các tùy chọn plugin TextFX, áp dụng cho nhiều tình huống khác nhau theo cách nhanh chóng.

Ví dụ: nếu bạn quyết định xóa cột thứ 2 hoặc cột thứ N một cách nhanh chóng, phương pháp này hoạt động gần như không có sửa đổi.

Các biểu thức chính quy, các tập lệnh shell, mặt khác, sẽ hoàn thành mục tiêu, vâng, nhưng trong các vấn đề phức tạp, bạn sẽ mất nhiều thời gian hơn để "gỡ lỗi" cú pháp của mình.

Chức năng tích hợp linh hoạt của Notepad ++ là một trong những thế mạnh chính của nó: bạn có được một chút sức mạnh mà không cần phải dùng đến "lập trình".


0

Nếu bạn quen thuộc với plugin bảng điều khiển Python cho Notepad ++, tôi có thể tư vấn cho bạn một phương pháp khác. Bạn cần thêm văn bản của mình vào tài liệu Notepad ++ và thực thi tập lệnh tiếp theo trong bảng điều khiển:

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

Kịch bản lệnh này đã thêm văn bản kết quả vào tài liệu Notepad ++ hiện tại của bạn.


-1

Chạy vim(trong chế độ lệnh, nếu không nhấn Escape).

Nhập lệnh sau để ánh xạ hành động xóa cột đầu tiên vào qkhóa:

:map q 0df,j0

Nghĩa là:

  • 0 - đi đến đầu dòng
  • df,- d elete mọi thứ cho đến khi , nhân vật (bao gồm cả dấu phẩy),
  • j - đi xuống một dòng
  • 0 - đi đến đầu dòng

Sau đó áp dụng hành động này cho tất cả các dòng:

:0,$ normal q

Có nghĩa là, chạy hành động được gán cho khóa qtừ dòng đầu (0) đến cuối ($).


Tại sao không chỉ làm một thay thế toàn cầu duy nhất với :%s/^[^,]\+,//g?
speakr

Bạn cũng có thể, cái này dễ sử dụng và dễ hiểu hơn là regex :) Thông thường tôi luôn nhầm lẫn nhân vật nào tôi sẽ thoát, vì vậy tôi kết thúc bằng cách gõ cùng một regex nhiều lần.
kenorb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.