转换一个巨大的txt文件

时间:2017-07-29 19:15:17

标签: python database file converter

我有一个huuge csv文件(524 MB,记事本打开它4分钟)我需要更改格式化。现在就是这样:

1315922016 5.800000000000 1.000000000000 1315922024 5.830000000000 3.000000000000 1315922029 5.900000000000 1.000000000000 1315922034 6.000000000000 20.000000000000 1315924373 5.950000000000 12.452100000000

线条被换行符号分隔,当我将其粘贴到Excel中时,它会分成几行。我会通过使用Excel函数来完成它,但文件太大而无法打开。 第一个值是自1-01-1970以来的秒数,第二个是价格,第三个是自愿。

我需要它像这样:

01-01-2009 13:55:59 5.800000000000 1.000000000000 01-01-2009 13:56:00 5.830000000000 3.000000000000

记录需要用空格分隔。有时,同一秒的价格有多个价值,如下所示:

1328031552 6.100000000000 2.000000000000
1328031553 6.110000000000 0.342951630000
1328031553 6.110000000000 0.527604200000
1328031553 6.110000000000 0.876088370000
1328031553 6.110000000000 0.971026920000
1328031553 6.100000000000 0.965781090000
1328031589 6.150000000000 0.918752490000
1328031589 6.150000000000 0.940974100000

当发生这种情况时,我需要代码从该秒开始取平均价格并且每秒只保存一个价格。 这些比特币交易在BTC开始时并非每秒都发生。 如果没有来自某个秒的记录,则需要创建一个具有以下秒的新记录,并且从最后已知的价格和体积中复制价格和体积的值。

然后将所有内容保存到新的txt文件中。

我似乎无法做到这一点,我一直试图在python中编写一个转换器几个小时,请帮忙。

2 个答案:

答案 0 :(得分:1)

shlex是一个词法分析器。我们使用它一次从输入中选择数字。函数records将这些组合成列表,其中列表的第一个元素是整数,其他元素是浮点。

循环读取records的结果,并根据需要按时间平均。它还会将两个输出打印到一行。

from shlex import shlex
lexer = shlex(instream=open('temp.txt'), posix=False)
lexer.wordchars = r'0123456789.\n'
lexer.whitespace = ' \n'
lexer.whitespace_split = True

import time

def Records():
    record = []
    while True:
        token = lexer.get_token()
        if token:
            token = token.strip()
            if token:
                record.append(token)
                if len(record)==3:
                    record[0] = int(record[0])
                    record[1] = float(record[1])
                    record[2] = float(record[2])
                    yield record
                    record=[]
            else:
                break
        else:
            break

def conv_time(t):
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t))

records = Records()

pos = 1
current_date, price, volume = next(records)
price_sum = price
volume_sum = volume
count = 1

for raw_date, price, volume in records:
    if raw_date == current_date:
        price_sum += price
        volume_sum += volume
        count += 1
    else:
        print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')
        pos = (pos+1)%2
        current_date = raw_date
        price_sum = price
        volume_sum = volume
        count = 1

print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')

以下是结果。您可能需要对小数点权限的有效数字执行某些操作。

2011-09-13 09:53:36 5.8 1.0 2011-09-13 09:53:44 5.83 3.0
2011-09-13 09:53:49 5.9 1.0 2011-09-13 09:53:54 6.0 20.0
2011-09-13 10:32:53 5.95 12.4521 2012-01-31 12:39:12 6.1 2.0
2012-01-31 12:39:13 6.108 0.736690442 2012-01-31 12:39:49 6.15 0.9298632950000001

答案 1 :(得分:0)

1)从文件中读取一行

data = {}
with open(<path to file>) as fh:
    while True:
        line = fh.readline()[:-1]
        if not line: break

        values = line.split(' ')
        for n in range(0, len(values), 3):
            dt, price, volumen = values[n:n+3]

2)检查最后一条记录之后的下一秒钟是否为   如果是这样,将价格和体积值添加到变量并增加计数器以便稍后用于计算平均值 3)如果第二个不是下一秒,则复制最后价格和体积的值。

            if not dt in data:
                data[dt] = []

            data[dt].append((price, volumen))

4)划分时间戳,如&#34; 1328031552&#34;分为秒,分钟,小时,天,月,年   以某种方式照顾差距​​年。

for dt in data:
    # seconds, minutes, hours, days, months, years = datetime (dt)

...以后用于计算平均值

    p_sum, v_sum = 0
    for p, v in data[dt]:
        p_sum += p
        v_sum += v

    n = len(data[dt])
    price = p_sum / n
    volumen = v_sum / n

5)在01-01-2009 13:55:59 1586.12 220000命令中安排值 6)将记录添加到新数据库文件的末尾。

    print(datetime, price, volumen)