当文本文件过大时,我们有时需要将文件拆小后处理。
当我们有 linux shell 环境时可以使用 linux 环境自带的小工具来拆分文件。
首先我们可以使用 sed 拆分文本文件,sed 在 Windows 版的 git-bash 中也可以使用。我们使用 sed 的范围打印功能,比如以下例子打印文件的1至5000行。
wc -l ip.merge.txt
683591 ip.merge.txt
$ sed -n '1,5000p' ip.merge.txt > 1_5000.txt
$ wc -l 1_5000.txt
5000 1_5000.txt
使用 sed 我们可以随意指定打印范围,非常灵活。
第二种方法是使用 split 工具,这款工具在 Windows 版的 git-bash 中也包含了,可以正常使用。
split -n 3 -d -a 3 ip.merge.txt index.part
wc -l index.part00*
222599 index.part000
228897 index.part001
232095 index.part002
683591 total
以上命令通过 -n 3 将文件拆成3份,-a 3 是后缀长度为3,-d 是以数字作为后缀。除了可以按份来拆分,也可以按行数进行拆分。
split -l 200000 -d -a 3 ip.merge.txt index.part
wc -l index.part00*
200000 index.part000
200000 index.part001
200000 index.part002
83591 index.part003
683591 total
如果没有linux环境,我们还可以使用Python编写脚本来搞定。脚本使用方法与 sed 类似,指定行的范围:
python ./split.py 100-200 ip.merge.txt
# 或者使用管道的方式
cat ip.merge.txt | python ./split.py 101-200
# 脚本使用 utf-8 编码读写文件
如果是在Windows下执行,标准输出的编码不为 utf-8
在 git-bash 下使用管道,需要按如下配置,不然会乱码
export PYTHONIOENCODING=utf-8
cat ip.merge.txt | python ./split.py 101-200
脚本 split.py 内容如下:
#!python3
import sys
f = sys.stdin
line_range = []
if len(sys.argv) == 3:
line_range = sys.argv[1].split('-')
f = open(sys.argv[2], 'r', encoding='utf-8')
elif len(sys.argv) == 2:
line_range = sys.argv[1].split('-')
else:
print("Usage:n python3 ./split.py 1-50 demo.txt")
sys.exit()
n = 1
begin, end = [int(x) for x in line_range]
if begin > end or begin < 1:
print("Error: wrong range!")
print("t", sys.argv[1])
sys.exit(-1)
line = f.readline()
while line:
if n == begin:
print(line, end='')
n += 1
line = f.readline()
while line:
if n <= end:
print(line, end='')
n += 1
line = f.readline()
if n > end:
f.close()
sys.exit()
else:
n += 1
line = f.readline()
f.close()
全文完。
评论