0

私はこのような名前の何千ものzip形式のcsvファイルを持っています:

result-20120705-181535.csv.gz

181535は18:15:35を意味します。今、これらのファイルを毎日午前2:00から翌日の午前2:00までマージしたいと思います(1週間にわたるデータがあり、すべて上記の例のように名前が付けられています)。次に、処理されたファイルをマージされたというフォルダに移動しました

そのため、現在のフォルダーには大量の.csv.gzファイルがあり、名前をスキャンして、20120705-02*, 20120705-03*... untilのようなすべてをマージ20120706-01*してから、 ...untilファイルをmergedというフォルダーに20120705-result.csv.gz移動して検索を開始します。翌日のデータ:20120705-02*, 20120705-03*20120706-01*20120706-02*.....20120707-01*

Pythonとbashのどちらのスクリプトを使用するのか、またどのように使用するのか疑問に思っています。

4

2 に答える 2

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分かかると仮定します:)

この自動化の方法が正しく機能するためには、上記のスクリプトを少し変更する必要があります。その後、当日に動作すると仮定して、日付を定義する2行を変更します。

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

それで十分です。いつものように、自動化する前に徹底的にテストしてください!

于 2012-07-09T15:55:54.010 に答える
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 に答える