2016-10-19 5 views
0

원시 데이터를 가져 와서 열을 재정렬하고, 여러 파일의 데이터를 기반으로 데이터를 추가하고, 하드 코딩 된 데이터를 추가 한 다음 "output.csv"파일에 저장합니다. 예를 들어파이썬을 사용하여 여러 파일의 데이터를 기반으로 csv 파일에 열을 추가 하시겠습니까?


...

File1.csv : (검색된 데이터)
사람, DATE_TIME, 사이트, 상태

Person1,01/13/16 10:38,SiteA,I 
Person1,01/20/16 12:53,SiteC,O 
Person2,01/21/16 14:45,SiteB,O 
Person3,01/17/16 12:17,SiteA,I 
Person3,01/25/16 10:15,SiteB,L 

File2.csv : (고정 데이터 1)
사이트, 코드

SiteA,101 
SiteB,102 
SiteC,103 

File3.csv : (고정 데이터 2)
,period_start_time, period_end_time 기간을 File1 원시 데이터가

00:00,07:59,0 
08:00,09:00,1 
09:01,10:00,2 
10:01,11:00,3 
11:01,12:00,4 
12:01,13:00,5 
13:01,14:00,6 
14:01,15:00,7 
15:01,23:59,X 

.
마지막 열에는 "I", "O"및 "L"이 있습니다.
"I"는 IN을 나타냅니다.
"O"는 OUT을 나타냅니다.
"L"은 LATE를 나타냅니다. 그들은 "L"또는 LATE 그들은 여전히려고하는 경우에

이 예제에서 또는 사이트 A, B 또는 C
주, 외가 세 학생들이있다.

File2에는 "사이트 코드"가 있습니다.

File3에는 period_start_time을 나타내는 첫 번째 열이 있고 두 번째 열은 period_end_time입니다.
세 번째 열은 마침표입니다.

은 내가 output.csv 파일을 작성해야합니다
는 어디, 누구를, 기간, 날짜, TIME_IN, TIME_OUT, USERNAME은 =이 필요

이있는 File2에서 해당 사이트 코드가 될 수 있습니다.
WHOM =은 사람입니다.
PERIOD = 시간이 10:38이면 파일 3에 의해 주어진 기간은 "3"입니다.
DATE = 시간을 'mm/dd/yy'로 표시하십시오.
TIME_IN = 상태가 "I"또는 "L"인 경우 시간을 'HH : MM'으로 표시하고, 그렇지 않으면 공란으로 남겨 둡니다.
TIME_OUT = "HH : MM"으로 시간을 표시하고 상태가 "O"인 경우 시간을 표시하고 그렇지 않으면 공백으로 남겨 둡니다.
USERNAME =은 (는) 하드 코드 된 "사용자 이름"입니다.

output.csv 파일은 위의 예제 데이터에서와 같이 읽어야합니다.

output.csv (데이터 포맷)

101,Person1,3,01/13/16,10:38,,Username 
103,Person1,5,01/20/16,,12:53,Username 
102,Person2,7,01/21/16,,14:45,Username 
101,Person3,5,01/17/16,12:17,,Username 
102,Person3,3,01/25/16,10:15,,Username 

주 첫 번째 열에 해당하는 번호.
TIME_IN 및 TIME_OUT 열의 경우 공란과 PERIOD에 유의하십시오.


마지막으로 가져 왔습니다.CSV 파일에서

from datetime import datetime as dt 
import csv 

class TimePeriod: 
    def __init__(self, starttime, endtime, periodname): 
     self.starttime = starttime 
     self.endtime = endtime 
     self.periodname = periodname 

def get_time_list(time_file): 
    timelist = list() 
    with open(time_file) as inputs: 
     for line in inputs: 
      starttime, endtime, periodname = line.strip().split(",") 
      timelist.append(TimePeriod(starttime, endtime, periodname))     
    return timelist 

def get_site_code_dict(site_code_file): 
    mydict = dict() 
    with open(site_code_file) as inputs: 
     for line in inputs: 
      site,code = line.strip().split(",") 
      mydict[site] = code 
    return mydict 

def process_raw(raw_file, site_code_dict): 
    with open(raw_file) as inputs, open('ouput.csv', 'w') as outlist: 
     for line in inputs: 
      person, date_time, site, status = line.strip().split(",") 
      time_object = dt.strptime(date_time, '%m/%d/%y %H:%M') 
      date = time_object.strftime('%m/%d/%y') 
      time = time_object.strftime('%H:%M') 
      filteredlist = filter(lambda x: time >= x.starttime and time <= x.endtime, time_list) 
      outlist.write(site_code_dict[site]+',') 
      outlist.write(person+',') 
      outlist.write(date+',') 
      outlist.write(filteredlist[0].periodname+',') 
      if status == "I" or status == "L": 
       outlist.write(time+',') 
      else: 
       outlist.write(""+',') 
      if status == "O": 
       outlist.write(time+',') 
      else: 
       outlist.write(""+',') 
      outlist.write("Username"+'\n') 
    outlist.close() 


if __name__ == "__main__": 
    site_code_dict = get_site_code_dict("file2.csv") 
    time_list = get_time_list("file3.csv") 
    process_raw("file1.csv", site_code_dict) 

출력 데이터 : 위의 코드와

101,Person1,01/13/16,3,10:38,,Username 
103,Person1,01/20/16,5,,12:53,Username 
102,Person2,01/21/16,7,,14:45,Username 
101,Person3,01/17/16,5,12:17,,Username 
102,Person3,01/25/16,3,10:15,,Username 

, 나는 순서대로 열을 가지고있다.
첫 번째 열에 올바른 코드가 있습니다.
날짜 열에는 'mm/dd/yy'형식의 날짜 만 있습니다.
레코드가 "I"또는 "L"인 경우 TIME_IN 열에는 군사 시간 만 있습니다.
TIME_OUT 열이 "O"인 경우 군대 시간이 있습니다.
"클래스"TimePeriod를 사용하여 기간을 마쳤습니다.

도움을 주셔서 감사합니다. 초심자입니다.

+0

첫 번째로드 파일 2는 코드에 대한 사이트 매핑을 만듭니다. 그런 다음 파일 1을 구문 분석 할 때 다른 모든 데이터를 포함하여 들어있는 사람 목록을 유지하고 아웃 라인이 표시되면 파일에 쓰고 목록에서 제거하십시오. 하루가 끝날 때 일치 항목이없는 항목이있을 경우 청소를해야 할 수도 있습니다. –

답변

0
def get_site_code_dict(site_code_file): 
    mydict = dict() 
    with open(site_code_file) as inputs: 
     for line in inputs: 
      site,code = line.strip().split(",") 
      mydict[site] = code 
    return mydict 


def process_raw(raw_file, site_code_dict): 
    with open(raw_file) as inputs: 
     for line in inputs: 
      person, date_time, site, status = line.strip().split(",") 
      outlist = list() 
      outlist.append(site_code_dict[site]) 
      outlist.append(person) 
      outlist.append(date_time) 
      outlist.append(status) 
      print ",".join(outlist) 


if __name__ == "__main__": 
    site_code_dict = get_site_code_dict("file2") 
    process_raw("file1", site_code_dict) 

출력 :

101,Person1,01/13/16 10:38,I 
103,Person1,01/20/16 12:53,O 
102,Person2,01/21/16 14:45,O 

당신은 사이트 이름과 코드 번호를 결합하는 get_site_code_dict 같은 키 - 값 쌍을 만든 다음 원시 데이터를 처리하는 데 사용할 수 있습니다.

+0

고마워,이 작품은 좋아 보인다. 기본 질문에 대답했지만 출력 데이터는 아직 완료되지 않았습니다. 상태 열은 출력 데이터에 필요하지 않습니다. 마지막 열에 하드 코딩 된 텍스트를 추가하여 질문을 편집했습니다. 그러나 세 번째와 네 번째 열은 상태로 채워집니다. "I"또는 "L"이 3 일에 시간을 채우고 "O"가 4 일을 채우는 경우. – Mobs

+0

기꺼이 그것을 알고 기꺼이 – haifzhan

+0

인쇄 대신 .csv 파일로 목록을 저장 하시겠습니까? 나는 시도해 봤지만 마지막 줄이있는 파일을 얻었습니다. – Mobs

관련 문제