2017-05-11 10 views
1

申し訳ありません、愚かな質問です。私はちょうど疲れているかどうかは分かりませんが、この問題を解決するロジックを理解するのは苦労しています。CSVをクリーンアップ - 新しい行を開始

私はこのようになりますCSV持っている:

Company,CompanyName, 
Website,WebsiteName , 
Website, WebsiteName2, 
Email, emailData, 
Company,NextCompanyName, 
Website,websiteName, 
Website, WebsiteName2, 
Company,NextCompanyName, 
Name,PersonName, 
Website,websiteName, 

あなたが見ることができるように、それはかなり厄介なデータです。私がしたいことは、CSV全体を読み込み、CompanyNameで各行を区切り、できるだけ多くのデータを整理しようとします。会社には人の名前が付いていることもあれば、複数のウェブサイトがあることもあれば、電子メールがあることもあります。

だから私の所望の出力は次のようになります。 会社名、個人名、メールアドレス、WEB1、WEB2、など

良いニュースは、すべてのデータが各行のセパレータ(会社、ウェブサイト、名前を持っているということです、など)。私がしたいことは、CSVを介して読み込まれ、Company、CompanyNameのように見える行が見つかると、新しい行を開始し、データをソートします(Name to Name列、emailColumnなど)。会社、会社名のように見える行。

私が読んで、ヘルプ/ csvファイルへの書き込みを必要といけない。私は適切にデータを反復処理し、それがために必要がある場合にデータをソートする方法についてのヘルプを探しています。

あなたが私に与えることができる任意の提案ありがとう

+1

「会社」と「会社」の間のデータには、1つのレコードに関する1組のキーと値のペアが含まれていますか?たとえば、上のケースでは、「CompanyName」という名前の会社と、WebsiteNameとWebsiteName2の2つのWebサイトと、1つのemail-emailDataという会社があります。 –

+0

事前にすべてのプロパティ名を知っていますか?または1つまたは複数のアイテムを持つプロパティ名はどれですか? – tdelaney

+0

Gratus D. "Company"と "Company"の間のデータを修正すると、1つのデータセットで構成されます。 –

答えて

0

あなたは単純な条件を使用し、すべてをリスト、または単一の辞書に並べ替えることができます(それは少し複雑ですが、それほど複雑ではありません)

companyList = [] 
with open("foo.csv", "r") as f: 
    for line in f: 
     if "Company" in line: 
      companyList.append(line.split(',')[1]) 

それぞれの行のリストを作成し、csvを元に戻して書き直してください。

1

ファイルの行を繰り返し処理するときに、レコードの開始条件を確認できます。 dictに各キーと値のペアを記録します。開始がわかると、既存のレコードが完成していることがわかります。あなたのレコード辞書の値をリストにし、新しい値を追加することができます。

from collections import defaultdict 
import csv 
import re 

filename = 'mytest.csv' 

# test data 
open('mytest.csv', 'w').write("""Company,CompanyName, 
Website,WebsiteName , 
Website, WebsiteName2, 
Email, emailData, 
Company,NextCompanyName, 
Website,websiteName, 
Website, WebsiteName2, 
Company,NextCompanyName, 
Name,PersonName, 
Website,websiteName,""") 

# will hold dict for each company 
records = [] 

with open(filename, newline='') as in_fp: 
    record = defaultdict(list) 
    for row in csv.reader(in_fp): 
     if len(row) >= 2: 
      if row[0].strip() == "Company" and "Company" in record: 
       # found new company... record old as long as it has data 
       records.append(record) 
       record = defaultdict(list) 
      record[row[0].strip()].append(row[1].strip()) 

for record in records: 
    print('----') 
    print(record) 
+0

ありがとうございました。感謝します –

関連する問題