2017-01-11 3 views
0

私は本当に立ち往生しています。ここでの作業は、5000レコードのCSVの日付をフィルタリングして特定の日付範囲を検索し、昇順に並べ替えてから、文章を作成する別の列のフィールドを取得することです。私は正常に日付を並べ替えることができましたし、それらを注文しますが、私の問題は今、私はその行に対応する単語を取得する方法を知らないということです。コードは次のとおりです。条件に基づいてCSVファイル内の単語を検索する必要があります

#/usr/bin/python3 

import csv 
import time 


def finder(): 
    with open('sample_data.csv', encoding="utf8") as csvfile: 
     reader = csv.DictReader(csvfile) 
     r = [] # This will hold our ID numbers for rows 
     c = [] # This will hold our initial dates that are filtered out from the main csv 
     l = [] # This will hold our sorted dates from c 
     w = [] # This will hold our words 
     sentence = '' #This will be our sentence 

     # Filter out created_at dates we don't care about 

     def filterDates(): 
      for row in reader: 
       createdOn = float(row['created_at']) 
       d = time.strftime('%Y-%m-%d', time.localtime(createdOn)) # Converts dates 

       if d < '2014-06-22': 
        pass 
       else: 
        c.append(d) 

     filterDates() 

     def sort(c): 
      for i in c: 
       if i > '2014-06-22' and i < '2014-07-22': 
        l.append(i) 
        l.sort(reverse=False) 
       else: 
        pass 

     sort(c) 

     def findWords(l): 
      for row in reader: 
       words = row['word'] 
       for x in range(l): 
        print(words[0]) 

     findWords(l) 

finder() 

私はこのコードがおそらくお粗末なものであると知っています。私はそれを仕事の挑戦と見て、簡単にやり遂げることができると思っていたが、明らかに私のPythonはあまりにも嗅ぎどころではない。以前はPython CSVを使っていませんでした。私はこの仕事にはもはや応募しないバットからすぐに言いますが、それが分からなければ私は狂ってしまいます。私はすでに別のものを試して何時間も過ごしました。問題は、正しい日付の行を取って単語を得る方法にあります。

すべての提案とお手伝いがあります。自分の正気のために、私はこれを理解する必要があります。

おかげで、 RDD

データサンプル:

id created_at first_name last_name email gender company currency word drug_brand drug_name drug_company pill_color frequency token keywords 
1 1309380645 Stephanie Franklin [email protected] Female Latz IDR transitional SUNLEYA Age minimizing sun care AVOBENZONE, OCTINOXATE, OCTISALATE, OXYBENZONE C.F.E.B. Sisley Maroon Yearly ______T______h__e________ _______N__e__z_____p______e_____________d______i______a_____n__ _____h__i__v__e___-_____m___i____n__d__ _____________f ________c_______h__a__________s_.__ _Z________a_____l_____g________o__._ est risus auctor sed tristique in 
2 1237178109 Michelle Fowler [email protected] Female Skipstorm EUR flexibility Medulla Arnica Medulla Arnica Uriel Pharmacy Inc. Yellow Once _____ morbi vestibulum velit id 
3 1303585711 Betty Barnes [email protected] Female Skibox IDR workforce Rash Relief Zinc Oxide Dimethicone Touchless Care Concepts LLC Purple Monthly ___ ac est lacinia 
4 1231175716 Jerry Rogers [email protected] Male Cogibox IDR content-based up and up acid controller complete Famotidine, Calcium Carbonate, Magnesium Hydroxide Target Corporation Maroon Daily NIL augue a suscipit nulla elit 
5 1236709011 Harry Garrett [email protected] Male Yotz RUB coherent Vistaril HYDROXYZINE PAMOATE Pfizer Laboratories Div Pfizer Inc Orange Never �_nb_l_ _u___ __olop __ __oq_l _n _unp_p__u_ _od___ po_sn__ op p_s '__l_ _u__s_d_p_ _n_____suo_ '____ __s _olop _nsd_ ___o_ morbi ut odio cras 
6 1400030214 Lori Martin [email protected] Female Aivee EUR software Fluorouracil Fluorouracil Taro Pharmaceutical Industries Ltd. Pink Daily _ dui vel sem 
7 1368791435 Joe Turner [email protected] Male Mycat IRR tangible Sulfacetamide Sodium Sulfacetamide Sodium Paddock Laboratories, LLC Aquamarine Often 1;DROP TABLE users nulla facilisi cras non velit 
8 1394919241 Ruth Bryant [email protected] Female Browsecat IDR incremental Pollens - Trees, Mesquite, Prosopis juliflora Mesquite, Prosopis juliflora Jubilant HollisterStier LLC Aquamarine Weekly ___________ et magnis dis 
9 1352948920 Cynthia Lopez [email protected] Female Twitterbeat USD Up-sized Ideal Flawless Octinoxate, Titanium Dioxide Avon Products, Inc Red Daily (_�_�___ ___) purus eu magna 
10 1319910259 Phillip Ross [email protected] Male Buzzshare VEF data-warehouse Serotonin Serotonin BioActive Nutritional Orange Weekly __ vel sem 

わかりましたので、いくつかは、ウェストリーホワイトから大きな助けを微調整した後、私はこの機能を得ることができました!私は、それが仮定されていることをやっている1つのネストされた関数に凝縮している!コードは次のとおりです。

#/usr/bin/python3 

import csv 
import time 

def finder(): 

    with open('sample_data.csv', 'r', encoding='latin-1') as csvfile: 
     reader = csv.DictReader(csvfile) 
     def dates(reader): 
      # Set up variables 
      date_range = [] 
      sentence = [] 

      # Initiate iteration through CSV 
      for row in reader: 
       createdOn = float(row['created_at']) 
       words = str(row['word']) 
       d = time.strftime('%Y-%m-%d', time.localtime(createdOn)) # Converts dates 

       if d >= '2014-06-22' and d <= '2014-07-22': 
        date_range.append(d) 

       date_range.sort() 

       for word in words: 
        if d in date_range: 
         sentence.append(word) 

      print(sentence) 

     dates(reader) 

finder() 

残っている問題は1つだけです。 sentence[]が付加すると、各文字を1つずつ追加します。私はそれらをすべて一緒に組み合わせることなく、CSV列の単語に文字を組み合わせる方法を知りません。何か案は?

ありがとうございます!

+4

これを追加しますか閉鎖する必要はありません... –

+0

ファイルを添付する方法はありますか?可能であれば、CSV全体を添付します。それは単なるサンプルデータです。 また、閉鎖を必要としないとはどういう意味ですか?申し訳ありませんが、私のPythonは素晴らしいことではありません。ちょうど中断後にそれに戻ってくる。 – RedDeadVolvo

+0

正直なところ、ヘッダーと最初の2行だけが必要です。クロージャに関しては、関数内で関数を定義する理由を尋ねています。次に、関数内で関数を呼び出すだけです。意味がありません。これらの機能を再利用することはできません。 –

答えて

2

データのフォーマット方法はわかりませんが、これは私の試みです。

インポート時

def finder(start_date='2014-06-22', end_date='2014-07-22'): 
    """ 
    :param start_date: Starting date 
    :param end_date: Ending date 
    """ 

    def filterDates(reader): 
     datelist = [] 
     for row in reader: 
      created_on = float(row['created_at']) 
      d = time.strftime('%Y-%m-%d', time.localtime(createdOn)) # Converts dates 

      # Is between starting and ending dates 
      if d >= start_date and d <= end_date: 
       # Going to use the created_on value so we dont have to reformat it again 
       datelist.append(created_on) 
     return datelist 

    def findWords(reader, datelist): 
     for row in reader: 
      if float(row['created_at']) in datelist: 
       words = row['word'] 
       for word in words:  
        print(word) 

    with open('sample_data.csv', encoding="utf8") as csvfile: 
     reader = csv.DictReader(csvfile) 

    dates = filterDates(reader) 
    dates = dates.sort() 
    findWords(reader, dates)  

finder('2014-06-22', '2014-07-22') 

EDIT: あなたはこの

を使用し、リストに各単語を追加ループ

sentence_list = [] 

変更

words = row['word'] 
のこの外側を追加したい場合 あなたは、文字列を使用したい場合は

word = row['word'] 

から

は、その後、あなたが印刷するときループ

sentence = "" 

のこの外側を追加

sentence_list.append(word) 

for word in words:  
    print(word) 

を変更します言葉は、単にそれを文

# adding a Word to the sentence 
sentence = "{} {}".format(sentence, word) 

、最終的には、ここでは、ネストされた関数定義とは何ですか?ループの外の下に

print(sentence) 
+0

こんにちは、これは助けトン!ここで行ったことのいくつかを使用しましたが、問題の再調査にも役立ちました。新しいコードと質問で最初の投稿を更新しました。 ご協力いただきありがとうございます! – RedDeadVolvo

+1

心配はいりません。私はあなたの問題を解決してうれしいです:) –

+1

更新された答えを確認してください。私はrow ['word']要素に複数の単語があると思いました。 1つの単語しかないので、それを文字列に追加するか、後で使用するためにリストに追加するだけです。 –

関連する問題