2011-12-10 18 views
1

237行のトランザクションを含むCSVファイルがありますが、すでに正しい順序でトランザクションを分類してソートし、新しいCSVファイルを作成しました。口座番号でしかし、私はさらに一歩進んで、その口座番号の取引すべてで口座番号に基づいて複数のCSVファイルを作成したいと思います。類似アイテムのリストに基づいてファイルを作成して書き込む

アカウント番号に基づいて適切なCSVファイルに各行を追加するだけですが、これを動的に実行したいので、各変数を作成する必要はありません常に未知数の口座番号。

Account #, Date, Dollar Amount (stored as heading) 
001, 1/1/11, $25 
001, 1/1/11, $20 
002, 1/1/11, $15 
003, 1/4/11, $19 

このデータでは、アカウント番号に基づいて3つの別々のCSVファイルを作成したいと考えています。私は誰かがコードを書くのを探しているわけではありませんが、Pythonにはこのタイプのプロセスが関与していることに気づいていないモジュールがいくつかあります。誰かが私を正しい方向に向けることができたら、私はそれを高く評価します。

ありがとうございました

+0

を読まされ、それがすべて収集するために(私が思うに)常にpreferrableですデータを最初に作成し、結果をファイルに書き込むだけです。ログファイルや履歴ファイルのように、ファイルを拡張しようとすると、追加モードでファイルを開くことができます。あなたの場合は、メインのCSVからすべてのデータを収集し、それを適切な方法でグループ化し、各ファイルを次々に書き込む必要があります。実際にスクリプトを実行するよりも、話すのがずっと遅いです。 – heltonbiker

答えて

1

これはすばやく効率的ではないソリューションです。

from sets import Set 
import csv 

source = list(csv.reader(open("account_file.csv"))) 

accounts = Set(line[0] for line in source) 

for account in accounts: 
    out = open(account+".csv","w") 
    out.write("\n".join(",".join(x) for x in source if x[0] == account)) 
    out.close() 
+0

本当にありがとう、これは私が必要としていたものです。 1つは私に魚を教えていて、1つは私に魚を与えて以来、解決策としてどの答えを作るのか分かりません。私はその解決策とその理由を理解していますが、私はリストとセットをもう少し読んで、完全に理解する必要があります。 –

+0

@akevitこのソリューションでは、ファイルは異なるアカウントと同じ回数だけ読み込まれます。それはあまり良くありません。モード 'w'が以前に存在していたファイルを消滅させるという事実にも気をつけてください。 – eyquem

+0

@eyquemこれまでのファイルは消えていましたが、ソース変数を既存の変数に変更しました。リストのリストとしてCSV(ソート済み)。それがプログラムの効率を変えるかどうかは不明です。 –

1

このようなモジュールはありません。私は、アカウント操作ごとに別々のリストを作成し、keyがアカウント番号である辞書に入れます。入力ファイル全体を反復処理した後、各リストを保存して.csvファイルに分割することができます。

入力ファイルがすでにソートされている場合は、行を出力ファイルにコピーしてから、アカウントを変更すると出力ファイルを閉じ、新しいアカウントの次の出力ファイルを開くことができます。

+0

これは、出力ファイルを1つずつ保存するという私の以前のコメントに沿い、追加モードではありません。 – heltonbiker

+0

両方のおかげで、何らかの理由でアイデアが私に来なかった。私は辞書でこれを何らかの形で実装しようとしていましたが、その後は各ファイルをソートしなければなりませんでした。この方法でうまくいくはずだと思います。ありがとうございます。 –

0

CSVインターフェースの必要がありません、私はこれを好む:

from collections import defaultdict 
from os.path import getsize 

with open('accounts.csv') as f: 

    first_line = f.readline() 

    d = defaultdict(list) 
    for line in f: 
     d[line.split(',')[0]].append(line) 

    for account,lines in d.iteritems(): 
     with open(account+'.csv','a') as f: 
      if getsize(account+'.csv')==0: 
       f.write(first_line) 
      f.write(''.join(lines)) 

ファイルを、このような作業に一度だけ

+0

私はこれがうまくいくと信じていますが、残念ながら私が働いていることは私の必要を満たす以上のものです。私は膨大な量のトランザクションを増やすことはできません。私のコードは数秒しかかかりません。私はいくつかの新しいことを学ぶための自由な時間があるときに、あなたが書いたことをよりよく見ていきます。 - ありがとうございました。 –

関連する問題