私たちの機器で生成された膨大な量の .CSV ファイルをソートしようとしていますが、ソート部分で在庫がありました。すべてのファイルは 30 以上の列で構成され、無限の数の行を持つことができます。実装する必要があるのは、複数の行の複数の列で同時に発生するイベントをチェックする方法です。たとえば、結果のいずれかを確認する必要があります。
- 列「Test_Res_1」の値は、15 個の連続した睾丸に対して 12 未満でした
- 列「Test_Res_2」の値は、10 個の連続した睾丸に対して 5 未満でした
- 列「Test_Div」の値は、連続する 20 個の精巣で 15 未満でした
- 列「Test_time」の値は、10 個の連続した睾丸に対して 60 未満でした
- .........いくつかの連続したテストのためのいくつかの他の条件....
次に、1 つまたは複数の条件が満たされた場合、そのファイルの名前を .txt ファイルに書き込みます。このフォーラムのユーザーから提案されたコードを実装しましたが、スクリプトは正常に動作します。しかし、別の条件をチェックするたびにチェックを実行するブロックをコピーするだけです。そのコードを実装し、現在持っている巨大なスクリプトを削減するためのより良い方法があると確信しています。
ファイルの例を次に示します。
そのフォーラムで見つけたいくつかの提案を試しましたが、どれもうまくいきませんでした。それらのいくつかは 1 つの条件で動作しましたが、前述のようにいくつかの条件を確認する必要があります。条件が満たされた場合にファイルを開いて.txtに保存する方法は知っていますが、複数の列と行で複数の条件を確認する方法がわかりません。1 行をチェックするのは簡単ですが、複数の行をチェックするのは大変です。
import os, os.path, zipfile, csv, datetime
import smtplib, os
f = open("test.txt", "w")
flagtotal=[]
path="datafiles/" # insert the path to the directory of interest
dirList=os.listdir(path)
for filename in dirList:
if filename.endswith((".csv")):
file=os.path.splitext(filename)
reader = csv.reader(open(filename))
# I GOT STOCK HERE!!!! Although the code seems to work just fine. I create a completely new instance for reader every time I want to add new condition. reader.next() # skip header row GROUP_SIZE = 5 THRESHOLD = 0.5 cond_deque = deque(maxlen=GROUP_SIZE) # *maxlen* requires Python version 2.6+ linenum = 0 while len(cond_deque) < GROUP_SIZE-1: try: row = reader.next() linenum += 1 col0, col1, col4, col5, col6, col23, col24, col25 = ( float(row[i]) for i in (0, 1, 4, 5, 6, 23, 24, 25)) cond_deque.append(col1 < THRESHOLD) except StopIteration: print 'less that {} rows of data in file'.format(GROUP_SIZE) break # then process any remaining lines for row in reader: col0, col1, col4, col5, col6, col23, col24, col25 = ( float(row[i]) for i in (0, 1, 4, 5, 6, 23, 24, 25)) linenum += 1 cond_deque.append(col1 < THRESHOLD) if cond_deque.count(True) == GROUP_SIZE: str1 = 'Condition 1 in cycles {}-{} had {} consecutive cycles < {}'.format( linenum-GROUP_SIZE+1, linenum, GROUP_SIZE, THRESHOLD) #print str1 flag.append(str1) break # stop looking #checking for the second condition reader = csv.reader(open('processed_data/'+filename)) reader.next() GROUP_SIZE = 2 THRESHOLD = 20 cond_deque = deque(maxlen=GROUP_SIZE) # *maxlen* requires Python version 2.6+ linenum = 0 while len(cond_deque) < GROUP_SIZE-1: try: row = reader.next() linenum += 1 col0, col1, col4, col5, col6, col23, col24, col25 = ( float(row[i]) for i in (0, 1, 4, 5, 6, 23, 24, 25)) cond_deque.append(col1 < THRESHOLD) except StopIteration: #print 'less that {} rows of data in file'.format(GROUP_SIZE) break # then process any remaining lines for row in reader: col0, col1, col4, col5, col6, col23, col24, col25 = ( float(row[i]) for i in (0, 1, 4, 5, 6, 23, 24, 25)) linenum += 1 cond_deque.append(col5 < THRESHOLD/60) if cond_deque.count(True) == GROUP_SIZE: str1 = 'Condition 2 {}-{} had {} consecutive cycles < {} minutes'.format( linenum-GROUP_SIZE+1, linenum, GROUP_SIZE, THRESHOLD) #print str1 flag.append(str1) break # stop looking
today = datetime.date.today()
datestring='Date of testing: '+today.strftime('%m/%d/%Y')
if len(flagtotal)>0:
flagtotal.insert(0,datestring)
flagtotal.insert(1,'The following files met the criteria.\n--------------------------------------------')
f.write("\n".join(map(lambda x: str(x), flagtotal)))
f.close()