👩‍💻

言語処理100本ノック 2020 (Rev 2) 第2章: UNIXコマンド 16. ファイルをN分割する

2023/01/07に公開約1,400字

問題

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

solution16.py
import sys
import pandas as pd

if len(sys.argv) == 1:
    print('Set arg n, like "python chapter02/solution16.py 5"')
else:
    n = int(sys.argv[1])
    df = pd.read_csv('chapter02/popular-names.txt', sep='\t', header=None)
    nrow = -(-len(df) // n)

    for i in range(n):
        df.iloc[nrow * i:nrow * (i + 1)].to_csv(f'chapter02/solution16/solution16_{i}', sep='\t', index=False, header=None)
solution16_0.txt
Mary	F	7065	1880
Anna	F	2604	1880
Emma	F	2003	1880
Elizabeth	F	1939	1880
Minnie	F	1746	1880
#以下に続きます

solution16_1.txt〜solution16_4.txtまでの5つのファイルを取得できました。

solution16.sh
split -n $1 -d popular-names.txt solution16_sh/solution16_sh_
solution16_sh_00.txt
Mary	F	7065	1880
Anna	F	2604	1880
Emma	F	2003	1880
Elizabeth	F	1939	1880
Minnie	F	1746	1880
#以下に続きます

こちらもsolution16_sh_01.txt〜solution16_sh_04.txtまでの5つのファイルを取得できました。

この問題では、「14. 先頭からN行を出力」に加えて、X行のファイルをN分割するためにN個のファイルの行数を考えます。今回は-(マイナス)を使うことで繰り上げ処理を行っています。

df.iloc[ ]を使用すると、行番号や列番号で行や列の抽出を行うことができます。

https://github.com/kurokawa5/nlp100_2020/blob/main/chapter02/solution16.py

参考記事

第2章: UNIXコマンド
Pythonでコマンドライン引数を受け取る

Discussion

ログインするとコメントできます