Объединение дополнительной информации столбца из основной базы данных для некоторых выборочных записей - PullRequest
0 голосов
/ 23 мая 2018

Я работаю с двумя файлами, которые содержат миллионы записей.Просто поделитесь тестовыми данными, чтобы объяснить проблему, с которой я столкнулся.Например, tx_match.txt содержит все записи.И txid_time.txt имеет только несколько записей, которые имеют временные метки.Мой желаемый вывод показан ниже, идея состоит в том, чтобы объединить дополнительную информацию столбца из основной базы данных.Обратите внимание, что мне НЕ разрешается использовать библиотеку панд.

tx_match.txt

col1  col2  col3      col4
171    9    9    5000000000
183    171    9    4000000000
185    183    9    3000000000
187    185    9    2900000000
192    187    187  100000000
227    185    185  100000000
255    187    9    2800000000
504    367    367  5000000000
504    192    192  100000000
504    255    255  1000000000
533    293    293  5000000000
555    533    533  2500000000

txid_time.txt

col1      col2
227     2017-02-10
255     2017-01-10
504     2017-02-09

Мой желаемый результат:

227    185     185     100000000   2017-02-10
255    187     9       2800000000  2017-01-10 
504    367     367     5000000000  2017-02-09
504    192     192     100000000   2017-02-09
504    255     255     1000000000  2017-02-09

Пока я сделал это:

import csv 
d={}
fin = open("txid_match.txt","r")
for line in fin:
    try:
        line = line.rstrip()
        f = line.split("\t")
        k=f[0]
        v=f[1]
        d[k]=v
    except IndexError:
        continue

fin.close()
#print(d)
fin = open("txid_time.txt","r")
fout = open("txmatch_time.txt",'w')
foutWriter=csv.writer(fout)
for line in fin:
    try:
         line = line.rstrip()
         f = line.split("\t")
         txid=f[0]
         prvtxid=d[txid]    
         foutWriter.writerow([f[0]+"\t"+f[1]+"\t"+prvtxid])
    except IndexError:
         continue
    except KeyError:
         continue
fin.close()    
fout.close()   

Заранее спасибо за поддержку.

1 Ответ

0 голосов
/ 24 мая 2018

Ваше решение будет работать.Однако это влечет за собой линейную сложность в лучшем случае.Следующее решение улучшает его для достижения постоянной сложности в лучшем случае.Это также улучшает использование автоматических менеджеров контекста (оператор with), а также функций автоматического разбора и объединения в пакетах csv Reader и Writer соответственно. (обратите внимание, что я упустил IndexError и KeyError для ясности; вам, возможно, потребуется добавить их в себя)

import csv

col_delim = '\t'
row_delim = '\n'

with open('txid_time.txt', 'r') as ftime, open('tx_match.txt', 'r') as fmatch, open('txmatch_time.txt', 'w') as fmerge:
    rtime = csv.reader(ftime, delimeter=col_delim, lineterminator=row_delim)
    rmatch = csv.reader(fmatch, delimeter=col_delim, lineterminator=row_delim)
    wmerge = csv.writer(fmerge, delimeter=col_delim, lineterminator=row_delim)

    try:
        time = next(rtime)
        match = next(rmatch)
        continue_ = True
        while continue_:
            while time[0] < match[0]:
                time = next(rtime)
            while time[0] > match[0]:
                match = next(rmatch)
            if time[0] == match[0]:
                key = time[0]
                times = []
                try:
                    while time[0] == key:
                        times.append(time)
                        time = next(rtime)
                except StopIteration:
                    continue_ = False
                matches = []
                try:
                    while match[0] == key:
                        matches.append(match)
                        match = next(rmatch)
                except StopIteration:
                    continue_ = False
                for match in matches:
                   for time in times:
                       merge = match + time[1:2]
                       wmerge.writerow(merge)
    except StopIteration:
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...