0

我有成千上万个这样命名的压缩 csv 文件:

result-20120705-181535.csv.gz

181535 表示 18:15:35,现在我想每天合并这些文件(我有一周以上的数据,都像上面的例子一样命名),从凌晨 2:00 到第二天凌晨 2:00 ,然后将处理后的文件移动到一个名为 merge 的文件夹中

所以在当前文件夹中,我有大量的 .csv.gz 文件,我想扫描名称,将所有内容像20120705-02*, 20120705-03*...until20120706-01*合并20120705-result.csv.gz,然后将20120705-02*, 20120705-03*...until20120706-01*文件移动到一个名为 merge 的文件夹中,然后开始查找第二天的数据:20120706-02*.....20120707-01*

我想知道是否使用 python 或 bash 脚本来执行它,以及如何?

4

2 回答 2

0

这个答案是完全未经测试的,但希望它能提供一个工作的地方:

import datetime
import glob
from collections import defaultdict
import gzip
import os
import shutil

def day(fname):
    """
    Finds the "logical" day (e.g. the day minus 2 hours since your days 
    run from 2AM
    """
    d=datetime.datetime.strptime('result-%Y%m%d-%H%M%S.csv.gz')-datetime.timedelta(hours=2)
    return d.strftime('%Y%m%d')

files=sorted(glob.glob('result-*.csv.gz'))
cat_together=defaultdict(list)
for f in files:
    cat_together[day].append(f)

os.mkdir('merged')
for d,files in cat_together.items():
    outfile=gzip.open(d+'-result.csv.gz','wb')
    for f in files:
        gfile=gzip.open(f)
        outfile.write(gfile.read())
        gfile.close()
        shutil.move(f,'merged')
    outfile.close()
于 2012-07-09T16:22:17.887 回答
0

创建一个包含这些行的文本文件:

#!/bin/bash

mkdir merged
shopt -s extglob

d1=$1
d2=$(date -d "$d1 +1 day")

for f in result-@($d1-@(0[2-9]|[1-2][0-9])|$d2-0[01])*.csv.gz ; do
  gzip -cd $f
  mv $f merged/$f
done | gzip > $d1-result.csv.gz

并用.sh扩展名保存它(例如,myscript.sh)。接下来,在终端中,键入

chmod +x myscript.sh

现在你可以输入类似的东西

./myscript.sh 20120705

然后将按照您的描述进行。

要每天自动执行此操作,您可以在/etc/crontab文件中添加一行,例如

2 2 * * * root ./myscript.sh 

假设创建最后一个 .csv.gz 文件需要 1 分钟,再加上 1 分钟以确保 :)

为了使这种自动化方式正常工作,需要对上面的脚本进行一些修改。假设它将在当天运行,请更改定义日期的两行:

d1=$(date +%Y%m%d -d "now -1 day")
d2=$(date +%Y%m%d)

应该这样做。与往常一样,在自动化之前彻底测试它!

于 2012-07-09T15:55:54.010 回答