2017-01-26 9 views
1

の日付に基づいて大規模なcsvファイルを分割します。これで、私は以下のリンクに必要な答えの一部を見つけました.CSSファイルが2015-03-01,1,2,3,1,3形式最初の列は私は、最初の列が2015-03-01 00:00:00.000最初の列Python 3.4.3

How to split a huge csv file based on content of first column?

import csv 
from itertools import groupby 

for key, rows in groupby(csv.reader(open("largeFile.csv", "r", encoding='utf-16')), 
        lambda row: row[0]): 
with open("%s.txt" % key, "w") as output: 
    for row in rows: 
     output.write(",".join(row) + "\n") 

だから私はそれで大体1.7million行を持つ1つの大きなファイルを持っているの変更をする場合、この作業を続ける...

2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.01,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.02,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.03,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 
2015.01.03,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

そして、どうすればよいですプログラムは毎日新しいテキスト文書を作成しますが、それは素晴らしいです!

ただし、列が次のような場合は機能しなくなります。

2015-03-01 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-01 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-02 00:00:03.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-03 00:00:01.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

2015-03-03 00:00:02.000,NULL,NULL,NULL,NULL,NULL,0,1,0,1,0,0,0,1 

これは私に次のエラーを与えます。

Traceback (most recent call last): File "C:\Python34\Proj\documents\New folder\dataPullSplit2.py", line 6, in with open("%s.txt" % key, "w") as output: OSError: [Errno 22] Invalid argument: '2015-03-01 00:00:00.000.txt'

ここで正しい方向で私を指摘できますか?

Found Temp Solution 

「」私は今のファイルに追加していますし、key[:-13]を使用して、私はそれが動作...ファイル名にタイムスタンプを遮断することができたに「W」から、それを変更することによってそうOK、 ...それは遅いです...どうすればこれを改善し、なぜそれが遅くなっているのか理解できますか?

key = key.split()[0].replace('-', '.') 

全コード:

import csv 
from itertools import groupby 


def shorten_key(key): 
    return key.split()[0].replace('-', '.') 


for key, rows in groupby(csv.reader(open("asdf2.txt", "r", encoding='utf-16')), 
         lambda row: shorten_key(row[0])): 

    with open("%s.txt" % shorten_key(key), "a") as output: 
     for row in rows: 
      output.write(",".join(row) + "\n") 

迅速ここ

は今

import csv 
from itertools import groupby 

for key, rows in groupby(csv.reader(open("asdf2.txt", "r", encoding='utf-16')), 
        lambda row: row[0]): 

with open("%s.txt" % key[:-13], "a") as output: 
    for row in rows: 
     output.write(",".join(row) + "\n") 

答えて

1

動作するはずkeyを清掃、パターン2015.01.01を維持する必要があり、あなたのファイルを仮定したコードですテスト:

keys = ['2015-03-01 00:00:02.000', '2015.01.01'] 

for key in keys: 
    print(key.split()[0].replace('-', '.')) 

出力:

2015.03.01 
2015.01.01 
+0

まあ、私は今のためにそれを期待していたとして確かに働いています。私はそれが現在持っている唯一の問題は、実際の速度です...私のファイルでは、日付の書式を最初に修正し、1日の増分に分割するのには数分かかります、それは大雑把です270メガバイトであり、各ファイルは86400行に分割されます。これは、毎日の秒数です。 次のファイルには、分時秒数.000なども表示されます.1日分だけ分割すると約7-10分かかります。大きな違い。 –

+1

非常に多くのグループを生成するため、ファイルを開いたり閉じたりしているようです。短縮キーによるグループ化、つまり日付のみが役立ちます。私の更新された答えを見てください。 –

+0

これは、期待どおりの処理を高速化しました。私は最初に "w"を "a"に変更したときに、同じファイルを何度も上書きしていたことに気づいたので、それが何をしているのか疑問に思っていました。 –

関連する問題