Como eu iria dividir um arquivo CSV muito grande (7 milhões de linhas) em várias folhas / arquivos diferentes por uma coluna numérica específica? Deve dividir em cerca de 10 arquivos diferentes.
Como eu iria dividir um arquivo CSV muito grande (7 milhões de linhas) em várias folhas / arquivos diferentes por uma coluna numérica específica? Deve dividir em cerca de 10 arquivos diferentes.
Respostas:
Usa isto Python 3 programa:
#!/usr/bin/env python3
import binascii
import csv
import os.path
import sys
from tkinter.filedialog import askopenfilename, askdirectory
from tkinter.simpledialog import askinteger
def split_csv_file(f, dst_dir, keyfunc):
csv_reader = csv.reader(f)
csv_writers = {}
for row in csv_reader:
k = keyfunc(row)
if k not in csv_writers:
csv_writers[k] = csv.writer(open(os.path.join(dst_dir, k),
mode='w', newline=''))
csv_writers[k].writerow(row)
def get_args_from_cli():
input_filename = sys.argv[1]
column = int(sys.argv[2])
dst_dir = sys.argv[3]
return (input_filename, column, dst_dir)
def get_args_from_gui():
input_filename = askopenfilename(
filetypes=(('CSV', '.csv'),),
title='Select CSV Input File')
column = askinteger('Choose Table Column', 'Table column')
dst_dir = askdirectory(title='Select Destination Directory')
return (input_filename, column, dst_dir)
if __name__ == '__main__':
if len(sys.argv) == 1:
input_filename, column, dst_dir = get_args_from_gui()
elif len(sys.argv) == 4:
input_filename, column, dst_dir = get_args_from_cli()
else:
raise Exception("Invalid number of arguments")
with open(input_filename, mode='r', newline='') as f:
split_csv_file(f, dst_dir, lambda r: r[column-1]+'.csv')
# if the column has funky values resulting in invalid filenames
# replace the line from above with:
# split_csv_file(f, dst_dir, lambda r: binascii.b2a_hex(r[column-1].encode('utf-8')).decode('utf-8')+'.csv')
Salve como split-csv.py
e executá-lo a partir do Explorer ou da linha de comando.
Por exemplo, para dividir superuser.csv
baseado na coluna 1 e gravar os arquivos de saída dstdir
usar:
python split-csv.py superuser.csv 1 dstdir
Se você executá-lo sem argumentos, uma GUI baseada em Tkinter solicitará que você escolha o arquivo de entrada, a coluna (índice baseado em 1) e o diretório de destino.
Isto pode ser tão simples como este one-liner com awk
:
awk -F ',' '{ print > ("split-" $1 ".csv") }' 7mil.csv
7mil.csv
$3
ao invés de $1
42
estará em um arquivo chamado split-42.csv
Então, isso apenas lê todas as linhas e as imprime no arquivo que corresponde ao valor. Observe que ele é adicionado ao arquivo, portanto, se você executá-lo duas vezes, todos os dados serão duplicados; Portanto, verifique se não há arquivos com esse padrão de nomenclatura para iniciar: del split-*.cvs
A parte difícil para tentar isso é instalar awk
no Windows. Há gawk para Windows e um algumas dicas para executá-lo aqui .