1

У меня есть папка размером 300 ГБ, содержащая большие (около 2 ГБ) файлы CSV . Моя работа состоит в том, чтобы извлечь определенные строки из тех файлов, которые имеют значение в определенном столбце, который также существует во входном файле, который у меня есть (также размером 2 ГБ).

В настоящее время я пытаюсь использовать подход на основе python с использованием Pandas для получения нужных мне данных, но этот процесс очень медленный и из-за ограничений мне приходится читать как входной файл, так и каждый файл в папке как чанки, что занять некоторое время, чтобы сделать:

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

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .