การวางคอลัมน์หนึ่งคอลัมน์ของไฟล์ CSV โดยใช้ไฟล์ CSV ที่มีขนาดใหญ่มาก


1

ฉันมีโฟลเดอร์ 300GB ในขนาดที่มีขนาดใหญ่ (ประมาณ 2GB) CSVไฟล์ งานของฉันคือแยกแถวจากแฟ้มที่มีค่าในคอลัมน์เฉพาะที่มีอยู่ในไฟล์อินพุตที่ฉันมี (ขนาด 2GB เช่นกัน)

ขณะนี้ฉันกำลังพยายามใช้pythonวิธีการแบบพื้นฐานโดยใช้Pandasเพื่อรับข้อมูลที่ฉันต้องการ แต่กระบวนการนี้ช้ามากและเนื่องจากข้อ จำกัด ฉันต้องอ่านทั้งไฟล์อินพุตและไฟล์แต่ละไฟล์ในโฟลเดอร์เป็น chunks ซึ่งกำลังดำเนินการอยู่ ซักพักนึง:

all_wow_files = glob.glob('/media/noname365/0205D5FE310DDEEC/bing_verticals_wow_job/US_WOW/*_Keywords.csv')

for file in all_wow_files:

    print(file)

    for chunk in pd.read_csv(file, chunksize=500000):

            for chunk_dupe in pd.read_csv('input_file.csv',chunksize=500000, names=['Keyword']):

                keyword_list = set(chunk_dupe['Keyword'].tolist())

                chunk = chunk[chunk['Keyword'].isin(keyword_list)]

                chunk.to_csv(output_file,index=False, mode='a')

มีคำสั่งเฉพาะในbashฉันที่สามารถใช้เพื่อให้งานเสร็จเร็วขึ้นหรือไม่? ฉันไม่ต้องการอ่านไฟล์อินพุตทั้งหมดลงในหน่วยความจำเพื่อประโยชน์ของการเปรียบเทียบ ...

แก้ไข:

โดยทั่วไปไฟล์ในโฟลเดอร์จะถูกสร้างขึ้นเช่นนี้ในผลลัพธ์ของฉันฉันต้องการคอลัมน์ทั้งหมดที่รวมอยู่:

Parent ID, ID, Keyword 
1            1  yodel
1            2  keyworks
1            3  puppy dog
2            4  see-saw
...........

ในขณะที่ไฟล์อินพุตที่ฉันใช้อยู่เป็นเพียงคอลัมน์เดียวของสตริง:

apple
banana
orange
see-saw
moneybags
.....

โปรดระบุตัวอย่างของข้อมูลอินพุตและตัวอย่างของเอาต์พุตที่ต้องการ
agc

คำตอบ:


2

สคริปต์ awk นี้สามารถทำงานได้ (และจะไม่โหลดไฟล์ทั้งหมดในหน่วยความจำ)

awk -F\; '/Keyword/' input.csv >output.csv 

หากว่ามีตัวคั่นคือ;คีย์เวิร์ดคือKeywordไฟล์อินพุตคือinput.csvและไฟล์เอาต์พุตคือoutput.csv

หากคุณต้องการค้นหาคอลัมน์ใดคอลัมน์หนึ่งเพื่อให้มีคำหลักที่คุณควรใช้:

awk -F\; '$5==Keyword' input.csv >output.csv 

หรือ

awk -F\; '$5==Keyword {print}' input.csv >output.csv

หากต้องการค้นหาคำหลักมากกว่าหนึ่งคำคุณสามารถใช้คำหลักดังนี้:

awk -F\; '$5==Keyword1 || $6==Keyword2 {print}' input.csv >output.csv

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

วางบน jut อ่านคำตอบของคุณอีกครั้ง จริง ๆ แล้วไฟล์ input.csv มีคำหลักทั้งหมดที่ฉันต้องค้นหาในโฟลเดอร์ 300GB ฉันไม่สามารถค้นหาคำหลักทีละคำได้ที่นี่เนื่องจากฉันมีหลายล้านคำเพื่อค้นหาการจับคู่
user260504

ดูคำตอบที่แก้ไขของฉัน
Romeo Ninov

@ user260504 หากคุณต้องการวนซ้ำและเปลี่ยนชื่อไฟล์เอาต์พุต: for f in files; do some_command "$f" > "${f%.*}-modified.csv"; doneหรือคล้ายกัน ดูการจัดการสตริงสำหรับข้อมูลเพิ่มเติม
slhck

@slhck ขอบคุณสำหรับสิ่งนั้น นั่นเป็นคำค้นหาสองคำที่เหลืออยู่อีกหลายล้านเท่านั้น! lol
user260504
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.