2016-10-17 3 views
-1

Любая рекомендация о том, как я могу захватить данные из нескольких текстовых файлов и обрабатывать их (например, подсчитать общие суммы). Я пытался сделать это в Python, но продолжаю сталкиваться с тупиками.Данные процесса из нескольких текстовых файлов

Машина генерирует итоговый файл в текстовом формате каждый раз, когда вы выполняете операцию, для этого примера скрининг хороших яблок из партий. Сначала вы загружаете яблоки, тогда добро отделяется от плохих, а затем вы можете повторно загрузить плохие яблоки, чтобы повторно протестировать их, а некоторые восстановлены. поэтому по одной партии генерируется как минимум 2 файла сводки, в зависимости от того, сколько раз вы загружаете яблоки для восстановления.

Это пример текстового файла:

file1:

general Info: 
    Batch No.  : A2J3 
    Operation  : Test 
    Fruit   : Apple 
    Operation Number : A5500 
    Quantity In  : 10 
yield info: 
    S1 S2  Total Bin Name 
    5 2  7  good 
    1 2  3  bad 

file2:

general Info: 
    Batch No.  : A2J3 
    Operation  : Test 
    Fruit   : Apple 
    Operation Number : A5500 
    Quantity In  : 3 
yield info: 
    S1 S2  Total Bin Name 
    1 1  2  good 
    0 0  1  bad 

Я хочу, чтобы получить данные в папку с этим текстовые файлы и объединить результаты тестирования по следующим критериям:

  1. процесса та же партия, определяя, какие текстовые файлы приходят из той же номеров партии, те же операция (в зависимости от содержания в TXT-файле не имя файла)

  2. объединить 2 (или более итоговый файл) данные в следующий формат CSV:

    Lot: 
    Operation: 
    Bin  First Pass Second Pass Final Yield %Yield 
    Good  7   2   9   90% 
    Bad  3   1   1   10% 
    

S1, S2 является переменной величиной, она может идти от 1 до 14, но никогда не меньше 1. бункеры также может иметь несколько типов на различных текстовых файлов (не ограничивается только хорошо и плохо. но всегда будет только один хороший бин)

Bins: 
Good 
Semi-bad 
Bad 
Worst 
... 

Я новичок в Python и я только использовал этот язык сценариев в школе, я только не знаю, самые основы, ничего больше. Так что это задача, которую я хочу сделать, это немного подавляющим для меня, поэтому я начал обрабатывать один текстовый файл и получить данные, которые я хотел, например: номер партии

with open('R0.txt') as fh_d10SunFile: 
    fh_d10SumFile_perline = fh_d10SunFile.read().splitlines() 
    #print fh_d10SumFile_perline 

TestProgramName_str = fh_d10SumFile_perline[CONST.TestProgram_field].split(':')[1] 
LotNumber_str  = fh_d10SumFile_perline[CONST.LotNumber_field].split(':')[1] 
QtyIn_int   = int(fh_d10SumFile_perline[CONST.UnitsIn_field].split(':')[1]) 
TestIteration_str = fh_d10SumFile_perline[CONST.TestIteration_field].split(':')[1] 
TestType_str  = fh_d10SumFile_perline[CONST.TestType_field].split(':')[1] 

затем захватить все контейнеры в этом сводном файле :

SoftBins_str = filter(lambda x: re.search(r'bin',x),fh_d10SumFile_perline) 
for index in range(len(SoftBins_str)): 
    SoftBins_data_str = [l.strip() for l in SoftBins_str[index].split(' ') if l.strip()] 
    SoftBins_data_str.reverse() 
    bin2bin[SoftBins_data_str[0]] = SoftBins_data_str[2] 

тогда я застрял, потому что я не знаю, как сделать это чтение и анализ с несколькими н количество текстовых файлов, содержащих п количество сайтов (S1, S2). Как получить эту информацию из n количества текстовых файлов, обрабатывать их в памяти (это даже возможно с помощью python), а затем записать вывод с вычислением в выходной файл csv.

+0

Вы говорите ** как минимум два сводных файла **, но выходной формат фиксируется с двумя проходами? Также я предполагаю, что 'Lot:' является текущим 'Batch No.' и' Operation: 'is' Test'? –

+0

@MartinEvans да, это правильно –

+0

@SreejithMenon обновил вопрос с более подробной информацией и подходом, который я пытался сделать. –

ответ

1

Следующее должно помочь вам начать работу. Поскольку ваши текстовые файлы являются фиксированным форматом, их относительно просто читать и анализировать. Этот скрипт ищет все текстовые файлы в текущей папке, считывает каждый файл и сохраняет партии в словаре на основе имени партии, так что все партии с одинаковой зоной группируются вместе.

После обработки всех файлов он создает сводки для каждой партии и записывает их в один выходной файл csv.

from collections import defaultdict 
import glob 
import csv 

batches = defaultdict(list) 

for text_file in glob.glob('*.txt'): 
    with open(text_file) as f_input: 
     rows = [row.strip() for row in f_input] 

    header = [rows[x].split(':')[1].strip() for x in range(1, 6)] 
    bins = {} 

    for yield_info in rows[8:]: 
     s1, s2, total, bin_name = yield_info.split() 
     bins[bin_name] = [int(s1), int(s2), int(total)] 

    batches[header[0]].append(header + [bins]) 


with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output, delimiter='\t') 

    for batch, passes in batches.items(): 
     bins_output = defaultdict(lambda: [[], 0]) 
     total_yield = 0 

     for lot, operation, fruit, op_num, quantity, bins in passes: 
      for bin_name, (s1, s2, total) in bins.iteritems(): 
       bins_output[bin_name][0].append(total) 
       bins_output[bin_name][1] += total 
       total_yield += total 

     csv_output.writerows([['Lot:', lot], ['Operation:', operation]]) 
     csv_header = ["Bin"] + ['Pass {}'.format(x) for x in range(1, 1 + len(passes))] + ["Final Yield", "%Yield"]   
     csv_output.writerow(csv_header) 

     for bin_name in sorted(bins_output.keys()): 
      entries, total = bins_output[bin_name] 
      percentage_yield = '{:.1f}%'.format((100.0 * total)/total_yield) 
      csv_output.writerow([bin_name] + entries + [total, percentage_yield]) 

     csv_output.writerow([])  # empty row to separate batches 

Давать вам вкладку разделителей csv файла следующим образом:

Lot: A2J3 
Operation: Test 
Bin Pass 1 Pass 2 Final Yield %Yield 
Bad 3 1 4 30.8% 
Good 7 2 9 69.2% 

Обратите внимание, сценарий был обновлен, чтобы иметь дело с любым количеством типов бункеров.

Смежные вопросы