Notepad ++ - การลบคอลัมน์แรกในไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค


14

ฉันมีไฟล์ CSVขนาดใหญ่ที่ฉันต้องการลบคอลัมน์แรกของข้อมูล ฉันไม่สามารถเปิดใน Excel ได้เนื่องจาก Excel แปลงค่าบางอย่างในคอลัมน์ให้เป็นตัวเลขทางวิทยาศาสตร์

ฉันใช้Notepad ++และฉันพยายามสตริงคอลัมน์แรกจากไฟล์ 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

ให้ดูเหมือน

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

คำตอบ:


13

การค้นหาและแทนที่ Notepad ++ สนับสนุนการแสดงออกปกติ (regex) ซึ่งสามารถใช้งานได้ง่ายสำหรับสิ่งนี้

ใช้ regex ต่อไปนี้เพื่อค้นหา:

^[^,]+,(.+)

สิ่งนี้ตรงกับจุดเริ่มต้นของบรรทัดตามด้วยอักขระมากที่สุดเท่าที่จะเป็นไปได้ไม่ใช่เครื่องหมายจุลภาคตามด้วยเครื่องหมายจุลภาคตามด้วยส่วนที่เหลือของบรรทัด ส่วนที่เหลือของบรรทัดจะถูกจัดกลุ่มเป็นการส่งครั้งแรก

แทนที่ด้วยสิ่งนี้ทั่วโลก:

\1

สิ่งนี้หมายถึงการส่งครั้งแรก (ส่วนที่เหลือของบรรทัด) โดยที่แต่ละบรรทัดจะถูกแทนที่ด้วยทุกอย่างหลังจากคอลัมน์แรกและเครื่องหมายจุลภาค

หลังจากที่ฉันพบวิธีข้างต้นในการแทนที่ทั่วโลกเดียว (และปรับปรุงการตอบกลับของฉันตามลำดับ) ฉันสังเกตเห็นว่าการตอบกลับนี้เหมือนกันโดยทั่วไป แต่ยังให้คำอธิบายที่ครอบคลุมเกี่ยวกับ regex ที่ใช้


หมายเหตุ: regex ที่สั้นกว่า^[^,]+,ไม่สามารถใช้แทนโกลบอลด้วยสตริงว่างเนื่องจาก Notepad ++ จะแทนที่คอลัมน์ทั้งหมดยกเว้นคอลัมน์สุดท้าย: หลังจากแทนที่คอลัมน์แรกคอลัมน์ที่สอง (ซึ่งตอนนี้เป็นคอลัมน์แรกและตรงกับ regex) ถูกแทนที่แล้วที่สามและอื่น ๆ อย่างไรก็ตาม regex ที่สั้นกว่าทำงานได้อย่างสมบูรณ์แบบกับบรรณาธิการอื่น ๆ (เช่นกับPSPadหรือvim )


นี่คือวิธีที่จะไปที่นี่ หาก OP มี N ++ อยู่แล้วนี่เป็นวิธีที่เร็วที่สุด ฉันทำสิ่งนี้มากด้วยPSPad (ซึ่งสามารถทำได้ในครั้งเดียว btw) ตรวจสอบว่า regex ทำงานอย่างไร: rubular.com/r/OiehkBT0vA
simbabque

Notepad ++ ไม่ประมวลผลอินพุตบรรทัดต่อบรรทัด แต่อักขระทีละตัวอักษร ที่มีข้อดีบางอย่างเรียบร้อย (เช่นรูปแบบหลายบรรทัด)
เดนนิส

+1 สำหรับการแก้ไข น่าเศร้าคำตอบของคุณคือวิกิชุมชนตอนนี้
เดนนิส

@ เดนนิสใช่ฉันแก้ไขบ่อยเกินไปเนื่องจากฉันไม่ได้ตระหนักถึงข้อ จำกัด ในการแก้ไข 10 ครั้ง
speakr

ทำไมไม่^[^,]+,และแทนที่ด้วยที่ว่างเปล่า?
knittl

10

กดCtrl+ Hและทำการแทนที่ต่อไปนี้:

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

ตอนนี้กดAlt+ Aเพื่อแทนที่เหตุการณ์ทั้งหมด

มันทำงานอย่างไร

  • แสดงออกปกติ .*?,(.*)ตรงกับสายทั้งหมด:

    • .*?, จับคู่ทุกอย่างก่อนเครื่องหมายจุลภาคแรกรวมถึงเครื่องหมายจุลภาคเอง

      .*หมายถึงจำนวนที่เกิดขึ้นของตัวละครใด ๆ และเครื่องหมายคำถามทำให้ตัวบ่งชี้ที่ขี้เกียจคือมันตรงกับตัวละครน้อยที่สุด

    • (.*) จับคู่ทุกอย่างหลังจากเครื่องหมายจุลภาคแรก

      การล้อมรอบ.*ในวงเล็บจะแปลงเป็นรูปแบบย่อยเพื่อให้เสาสามารถเข้าถึงได้ในฟิลด์แทนที่

  • \1แสดงถึงการส่งครั้งแรก (ตรงกับ(.*))

    ดังนั้น Notepad ++ จะแทนที่บรรทัดด้วยทุกสิ่งที่ตามด้วยเครื่องหมายจุลภาคแรก


เพิ่งมีความคิดเดียวกันหลังจากพบว่า^[^,]+,ทั่วโลกแทนที่ด้วยสตริงว่างเปล่าจะไม่ทำงานใน Notepad ++ (+1)
speakr

6

ใน Windows คุณสามารถทำได้ดังนี้

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

ฉันคิดว่าคุณมีเพียง 6 คอลัมน์ หากคุณมีคอลัมน์มากขึ้นลองทดสอบกับ * ในฟิลด์โทเค็น แนวคิดถูกนำมาจากWindows สำหรับคำสั่ง


2
สำหรับจำนวนคอลัมน์โดยพลการใช้สิ่งนี้:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC

3

สมมติว่าคุณมีระบบลินุกซ์หรือสภาพแวดล้อมสไตล์ยูนิกซ์ (ผมชอบโกวหรือคุณสามารถ Snarf สาธารณูปโภคปิดunixutils ) ผมเชื่อว่าการทำงานของไฟล์ผ่านcut -d , -f2-6ควรทำเคล็ดลับ - ที่ควรถ้าผมจำได้อย่างถูกต้องจะทำเคล็ดลับ - -dชุด ตัวแยกและf2-6พิมพ์อักขระที่สองถึงที่ 6

cat input.csv | cut -d , -f2-6 > output.csvจะทำเคล็ดลับในการรับไฟล์อินพุตและกำจัดไฟล์เอาต์พุต มันไม่ได้ใช้ notepad แต่มันเร็วและง่ายจริงๆ


ขอบคุณฉันเพิ่งคลิกที่ลิงค์และฉันได้รับข้อผิดพลาด 403?
MikeD

ลิงก์ทั้งสองใช้ได้ผลกับฉัน - ซึ่งแปลกมาก ฉันมักจะพบโกวโดย googling สำหรับมัน - มันอยู่บน repo GitHub ที่เป็นของ bmatzelle Cygwin อาจเป็นตัวเลือกด้วยเช่นกัน แต่มันเกินความเป็นจริงสำหรับสิ่งนี้
Journeyman Geek

2

คุณควรจะสามารถโหลด CSV ลงใน excel และให้มันปฏิบัติต่อตัวเลขเป็นข้อความ (ป้องกันไม่ให้แปลงเป็นตัวเลขทางวิทยาศาสตร์)

  1. เปิด Excel
  2. แท็บข้อมูล
  3. จากข้อความ
  4. เลือกตัวคั่น
  5. เลือกอื่น ๆ : ","
  6. สำหรับคอลัมน์ทั้งหมดเลือกพวกเขาในหน้าต่างแสดงตัวอย่างข้อมูลและเลือกข้อความ
  7. ลบคอลัมน์ของคุณ
  8. บันทึกเป็น CSV

การแก้ไขและการบันทึกไฟล์ CSV ใน Excel มักจะแบ่งตัวเลขเช่นรหัส EAN และลอยแบบ US ในยุโรป Excel แม้ว่าคุณจะตั้งค่าทุกอย่างเมื่อนำเข้ามันจะเกิดอะไรขึ้นกับบางสิ่งบางอย่าง ฉันไม่สามารถแนะนำได้แม้ว่ามันอาจจะใช้ได้ ในสภาพแวดล้อมที่มีประสิทธิผลฉันจะให้คำแนะนำกับมัน
simbabque

มันใช้งานได้ดี! Thnak คุณ
miked

@simbabque ฉันจะบอกว่าไม่ยุติธรรมเล็กน้อยฉันได้ใช้มันประสบความสำเร็จในสภาพแวดล้อมการผลิตสำหรับชุดข้อมูลขนาดใหญ่ที่ต้องจัดการ - ยอมรับในบางครั้งมันเป็นฝันร้าย Excel มีนิสัยในการเปลี่ยนแปลงข้อมูลในรูปแบบที่ไม่คาดคิด แต่ฉันจะไม่พูดว่าความเสี่ยงนี้ยิ่งใหญ่กว่าวิธีอื่นโดยเฉพาะ
James Wood

ฉันใช้มันในบางโอกาสเช่นกัน แต่โดยส่วนใหญ่ฉันไม่ชอบที่จะทำ บ่อยครั้งที่การใช้ตัวแก้ไขข้อความที่รองรับการค้นหา regex & แทนที่เร็วกว่านั้นหากมีใครรู้วิธีจัดการมัน แม้ว่าจะไม่มีความผิดก็ตามเนื่องจากคำตอบของคุณชัดเจนและรัดกุม
simbabque

oi ไม่ได้ทำผิดกฎหมาย: D
James Wood

1

Notepad ++ มีการแก้ไขคอลัมน์ในตัวและคำสั่ง Line Up by (,) (ปลั๊กอิน TextFX) ที่ให้โซลูชันแบบจุดและคลิกที่เป็นกราฟิกซึ่งน่าจะเป็นครั้งแรกที่ถูกต้อง วิธีนี้หลีกเลี่ยงการใช้นิพจน์ปกติหรือการเขียนโปรแกรมเชลล์ซึ่งโดยทั่วไปจะต้องใช้การดีบักบางอย่างจนกว่าพวกเขาจะทำสิ่งที่คุณต้องการและไม่มีอะไรเพิ่มเติม

จุดเริ่มต้น : ไฟล์ CSV ที่มีคอลัมน์ไม่ตรงแนวดังนั้นจึงไม่ง่ายที่จะแก้ไขโดยคอลัมน์ ...

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

ขั้นตอน:

  1. เลือกแถวที่สนใจ - อาจเป็นไฟล์ทั้งหมด

  2. ใช้คำสั่งเมนู TextFX> TextFX Edit> จัดเรียงหลายบรรทัดตามคอมม่า (,) เรียงแถวทั้งหมดตามคอลัมน์และทำให้การแก้ไขคอลัมน์ง่ายขึ้น

    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. เข้าสู่โหมดคอลัมน์ที่คอลัมน์หลังเครื่องหมายจุลภาคแรก (,) สำหรับแถวจำนวนน้อยให้ใช้คำสั่งคีย์บอร์ด: Alt + Shift + DownArrow
    หากต้องการทำงานกับหลายแถว (ไฟล์ขนาดใหญ่) ให้ใช้ Alt + mouse และคลิกคอลัมน์ที่ต้องการของบรรทัดแรกจากนั้นเลื่อนไปที่บรรทัดสุดท้ายของไฟล์และ Alt + Shift + คลิกตำแหน่งคอลัมน์เดียวกัน สิ่งนี้จะเปิดใช้งานโหมดคอลัมน์ในไฟล์ทั้งหมด - คุณควรเห็นเส้นแนวตั้งด้านหลังเครื่องหมายจุลภาคทั้งหมด

  4. ลบในโหมดคอลัมน์จะลบอักขระทั้งหมดในคอลัมน์ ดังนั้นคุณสามารถลบทุกอย่างก่อนเครื่องหมายจุลภาคแรกในแถวทั้งหมดพร้อมกันเพื่อรับ:

    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
    

ทำ!

ข้อสังเกตในการแก้ปัญหานี้เมื่อเทียบกับคนอื่น ๆ ที่แนะนำ:

การแก้ไขโหมดคอลัมน์นั้นค่อนข้างทรงพลังและเมื่อรวมกับตัวเลือกปลั๊กอิน TextFX จะใช้กับสถานการณ์ที่หลากหลายในวิธีที่ง่ายและรวดเร็ว

ตัวอย่างเช่นหากคุณตัดสินใจที่จะลบคอลัมน์ที่ 2 หรือคอลัมน์ Nth อย่างรวดเร็ววิธีนี้จะทำงานโดยไม่มีการดัดแปลงใด ๆ

ในขณะที่นิพจน์ปกติเชลล์สคริปต์จะบรรลุเป้าหมายได้ แต่ในปัญหาที่ซับซ้อนคุณจะใช้เวลามากขึ้นในการ "ยกเลิกการบล็อก" ไวยากรณ์ของคุณ

ฟังก์ชั่นการใช้งานในตัวที่หลากหลายของ Notepad ++ เป็นหนึ่งในจุดแข็งหลัก: คุณได้รับพลังงานค่อนข้างน้อยโดยไม่ต้องหันไปใช้ "การเขียนโปรแกรม"


0

หากคุณคุ้นเคยกับปลั๊กอินคอนโซล Pythonสำหรับ Notepad ++ ฉันสามารถแนะนำวิธีอื่นให้คุณได้ คุณต้องเพิ่มข้อความของคุณในเอกสาร Notepad ++ และดำเนินการสคริปต์ถัดไปในคอนโซล:

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

สคริปต์นี้เพิ่มข้อความผลลัพธ์ลงในเอกสาร Notepad ++ ปัจจุบันของคุณ


-1

เรียกใช้vim(ในโหมดคำสั่งหากไม่กด Escape)

พิมพ์คำสั่งต่อไปนี้เพื่อแมปการดำเนินการลบคอลัมน์แรกกับqคีย์:

:map q 0df,j0

ซึ่งหมายความว่า:

  • 0 - ไปที่จุดเริ่มต้นของบรรทัด
  • df,- dหนึ่งคำทุกอย่างจน,ตัวอักษร (รวมทั้งจุลภาค)
  • j - ลงหนึ่งบรรทัด
  • 0 - ไปที่จุดเริ่มต้นของบรรทัด

จากนั้นใช้การกระทำนี้กับทุกบรรทัด:

:0,$ normal q

ซึ่งหมายความว่าให้เรียกใช้การกระทำที่กำหนดให้กับคีย์qจากบรรทัดที่จุดเริ่มต้น (0) ไปยังจุดสิ้นสุด ($)


ทำไมไม่เพียงแค่ทำการแทนที่แบบโกลบอลเดียว:%s/^[^,]\+,//g?
speakr

คุณสามารถทำได้เช่นกันอันนี้ใช้งานง่ายและเข้าใจมากกว่า regex :) โดยปกติฉันมักจะสับสนว่าตัวละครตัวไหนที่ฉันจะหลบหนีดังนั้นฉันจึงสิ้นสุดในการพิมพ์ regex เดียวกันหลายครั้ง
kenorb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.