2017-07-29 99 views
0

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

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以来的秒数,第二个是价格,第三个是volumen。

我需要它是这样的:

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开始时并不会每秒发生。 当某些秒没有记录时,需要创建一个新记录,其中包含以下第二个记录,以及从最后一个已知价格和volumen中复制的价格和智能体的值。

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

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

+2

你到目前为止尝试过什么?你能向我们展示一些你的代码,所以我们可以看到我们可以帮助的地方吗? – serk

+0

没有什么我试过让我甚至完成了10%的工作,所以我什么都没有。 –

+0

请你解释一下'01-01-2009 13:55:59 1586.12 220000 01-01-2009 13:56:00 1586.12 220000'是从输入中导出的吗? –

回答

1

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

循环根据需要读取records的结果和时间平均值。它还将两个输出打印到一条线上。

from shlex import shlex 
lexer = shlex(instream=open('temp.txt'), posix=False) 
lexer.wordchars = r'.\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 
+0

这是一个中间结果。 –

+0

现在全部结果可用。 –

+0

我很感激,这太棒了。谢谢。 –

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读取单行)检查,如果是后下一秒的最后一条记录的
如果是这样,加上价格和volumen值的变量,增加一个计数器,以便以后用于计算平均值
3)如果第二秒不是下一秒,则复制最后价格和体积的值。

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

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

4)划分的时间戳,如 “1328031552” 到秒,分钟,小时,天,月,年。
不知何故照顾缺口年。

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

...对于在2009年1月1日13时55分59秒1586.12 220000为了
6)添加记录计算平均

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)安排值以后使用到新数据库文件的末尾。

print(datetime, price, volumen)