非常に大きな(700万行)CSVファイルを特定の数値列でいくつかの異なるシート/ファイルに分割するにはどうすればよいですか。約10個の異なるファイルに分割する必要があります。
これを使用してください Python プログラム:
#!/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')
split-csv.py
として保存し、エクスプローラーまたはコマンドラインから実行します。
たとえば、列1に基づいてsuperuser.csv
を分割し、出力ファイルをdstdir
の下に書き込むには次を使用します。
python split-csv.py superuser.csv 1 dstdir
引数なしで実行すると、TkinterベースのGUIにより、入力ファイル、列(1ベースのインデックス)、および宛先ディレクトリを選択するように求められます。
これは、awk
を使用したこのワンライナーと同じくらい簡単です。
awk -F ',' '{ print > ("split-" $1 ".csv") }' 7mil.csv
7mil.csv
です。$3
ではなく$1
になります。42
のすべての行は、split-42.csv
という名前のファイルに含まれます。したがって、これはすべての行を読み取り、値に対応するファイルに出力するだけです。ファイルに追加されるため、2回実行すると、すべてのデータが複製されることに注意してください。したがって、開始するその命名パターンのファイルがないことを確認してください:del split-*.cvs
これを試すのが難しいのは、Windowsにawk
をインストールすることです。 gawk for Windows と ここで実行するためのいくつかのヒント があります。