2017-07-29 160 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)