Esempio n. 1
0
 def detect_playing(self, path_csv_folder, path_field_info, path_to_save,
                    path_statu_player, name):
     players = []
     time_table = []
     time_list = []
     sub_list = []
     p = []
     i = 0
     while i < 6:
         sub_list.append(p)
         i = i + 1
     # 필요한 리스트들을 선언하고 초기화해준다.
     # 파일과 폴더 경로이름을 지정해주는 부분
     path_csv_folder = path_csv_folder + name
     path_field_info = path_field_info + name + '/fieldmatch.txt'
     path_csv_folder = common_os_helper.check_slash(path_csv_folder)
     files_csv = glob.glob(path_csv_folder + '*.csv')
     path_to_save = path_to_save + name
     path_to_save = common_os_helper.check_slash(path_to_save)
     path_statu_player = path_statu_player + name
     path_statu_player = common_os_helper.check_slash(path_statu_player)
     for f in files_csv:
         f = f.replace('\\', '/')
     players = self.read_csv_files(players, files_csv, path_csv_folder,
                                   path_field_info)
     time_table = self.find_time_table(time_table, players)
     time_table = self.check_number_playing_in_time_table(
         time_table, players)
     self.write_playing(players, path_statu_player)
     time_list = self.detect_start_end_time(time_table, time_list)
     sub_list = self.find_sub_list(players, sub_list, time_list)
     self.write_log_file(sub_list, path_to_save, time_list)
    def detect_games(self, path_read_csv, path_read_xl, name_of_dir):
        path_read_csv = common_os_helper.check_slash(path_read_csv)
        path_read_xl = common_os_helper.check_slash(path_read_xl)
        name_of_dir = common_os_helper.check_slash(name_of_dir)

        try:
            file_read_xl = openpyxl.load_workbook(
                path_read_xl + self.find_file_name(name_of_dir, 'H', 'xlsx'))
            file_read_xl17 = openpyxl.load_workbook(
                path_read_xl +
                self.find_file_name(name_of_dir, 'H', 'xlsx', '17'))
        except FileNotFoundError:
            try:
                file_read_xl = openpyxl.load_workbook(
                    path_read_xl +
                    self.find_file_name(name_of_dir, 'A', 'xlsx'))
                file_read_xl17 = openpyxl.load_workbook(
                    path_read_xl +
                    self.find_file_name(name_of_dir, 'A', 'xlsx', '17'))
            except FileNotFoundError:
                return

        active_sheet18 = file_read_xl.active
        active_sheet17 = file_read_xl17.active
        Start1_18 = active_sheet18['A7'].value
        End2_18 = active_sheet18['E7'].value
        Start1_17 = active_sheet17['A7'].value
        End2_17 = active_sheet17['E7'].value

        object_edit_data = EditData()
        object_edit_data.split_file(Start1_18, End2_18, Start1_17, End2_17,
                                    path_read_csv, name_of_dir)
Esempio n. 3
0
    def convert_och_to_csv(self, path_och, path_csv, name_of_dir):
        # path_och 읽을 och파일이 저장된 path를 string으로 저장
        # path_csv csv파일을 쓰고자 하는 path를 string으로 저장
        # name_of_dir 읽을 csv파일과 och파일을 쓰고자 하는 dir name을 string으로 저장

        path_och = common_os_helper.check_slash(path_och)
        path_csv = common_os_helper.check_slash(path_csv)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_och = path_och + name_of_dir + '*.och'
        path_csv = path_csv + name_of_dir

        common_os_helper.create_dir(path_csv)

        files_och = glob.glob(path_och)
        # .csv의 경우 가장 첫번째 줄에 이후 정보들의 저장 순서를 저장함
        write_order = 'year,month,day,hour,minute,second,point_second,longitude,latitude,speed'

        for file_och in files_och:
            # .och파일과 같은 이름을 가진 .csv파일명 생성
            file_csv = path_csv + file_och[len(path_och) - 5:]
            file_csv = file_csv[:len(file_csv) - 3] + 'csv'

            file_to_read = open(file_och, 'r')
            file_to_write = open(file_csv, 'w')

            file_to_write.writelines(write_order + '\n')

            # 한 줄씩 .och파일을 읽으며 .csv파일에 적절히 변환하여 저장
            read_values = file_to_read.readlines()
            for read_value in read_values:
                try:
                    value_och_list = read_value.split(' ')
                    if len(value_och_list) < 4:
                        raise IndexError
                    value_time_list = value_och_list[0].split('.')
                    if len(value_time_list) < 7:
                        raise IndexError

                    # 시간과 관련된 정보는 '.'으로 이어져 있는 것을 ','로 연결
                    data_to_write = value_time_list[0]
                    for time_string in value_time_list[1:]:
                        data_to_write = data_to_write + ',' + time_string

                    # 이외의 정보는 ' '로 이어져 있는 것을 ','로 연결
                    for value_och_string in value_och_list[1:]:
                        data_to_write = data_to_write + ',' + value_och_string
                    file_to_write.write(data_to_write)

                except IndexError:
                    # .och 파일에 의미없는 정보가 저장된 줄은 pass
                    pass

            file_to_write.close()
            file_to_read.close()
Esempio n. 4
0
    def look_up_player(self, path_read_xl, path_raw_data, path_write, name_of_dir):
        # excel file에 뛰었다고 기록된 선수가 log.csv에 뛰었다고 기록되어 있고, 데이터도 있는지 확인, 기록
        path_read_xl = common_os_helper.check_slash(path_read_xl)
        path_raw_data = common_os_helper.check_slash(path_raw_data)
        path_write = common_os_helper.check_slash(path_write)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_raw_data = path_raw_data+name_of_dir
        path_write = path_write+name_of_dir

        files_raw = glob.glob(path_raw_data+'*.csv')
        player_raw = []
        error_list = []
        for player in files_raw:
            player = player.replace('\\', '/')
            player = player.replace(path_raw_data, '')
            player = player.replace('.csv', '')
            # player의 등번호가 시리얼 번호와 맞지않아 번환되지 않았다면 NoMatch error
            if '_' in player or '(' in player:
                error_list.append("NoMatch,"+str(player)+",There is no player_num")
            else:
                player_raw.append([int(player), 0])

        # 경기가 home인지 away인지 모르기 때문에 둘 다 시도
        try:
            file_to_read_xl = openpyxl.load_workbook(path_read_xl+self.find_file_name(name_of_dir,'H'))
        except:
            file_to_read_xl = openpyxl.load_workbook(path_read_xl+self.find_file_name(name_of_dir, 'A'))
        active_sheet = file_to_read_xl.active
        player_info = active_sheet['F11':'F28']
        player_num = []
        for player in player_info:
            if player[0].value:
                player_num.append([int(player[0].value),0])

        # excel file에 기록된 선수들의 데이터가 있는지 raw data로 확인, 기록
        error_code = [["NoData,", ",Can't find data"], ["NoPlayer,", ",Can't find Player"]]
        error_list = self.list_compare(player_num, player_raw, error_list, error_code, False)

        # error file에 기록
        write_order = "ErrorCode,ErrorValue,Detail\n"
        self.write_error(path_write, 'player_difference.txt', write_order, error_list)
Esempio n. 5
0
    def convert_csv_to_och(self, path_csv, path_och, name_of_dir):
        # path_csv 읽을 csv파일이 저장된 path를 string으로 저장
        # path_och och파일을 쓰고자 하는 path를 string으로 저장
        # name_of_dir 읽을 csv파일과 och파일을 쓰고자 하는 dir name을 string으로 저장

        path_och = common_os_helper.check_slash(path_och)
        path_csv = common_os_helper.check_slash(path_csv)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_och = path_och + name_of_dir
        path_csv = path_csv + name_of_dir + '*.csv'

        common_os_helper.create_dir(path_och)

        files_csv = glob.glob(path_csv)

        for file_csv in files_csv:
            # .csv파일과 같은 이름을 가진 .och파일명 생성
            file_och = path_och + file_csv[len(path_csv) - 5:]
            file_och = file_och[:len(file_och) - 3] + 'och'

            file_to_read = open(file_csv, 'r')
            file_to_write = open(file_och, 'w')

            # 한 줄씩 .csv파일을 읽으며 .och파일에 적절히 변환하여 저장
            read_values = file_to_read.readlines()
            for read_value in read_values[1:]:
                value_csv_list = read_value.split(',')

                # 시간과 관련된 정보는 ','로 이어져 있는 것을 '.'로 연결
                data_to_write = value_csv_list[0]
                for time_csv_string in value_csv_list[1:7]:
                    data_to_write = data_to_write + '.' + time_csv_string

                # 이외의 정보는 ','로 이어져 있는 것을 ' '로 연결
                for value_csv_string in value_csv_list[7:]:
                    data_to_write = data_to_write + ' ' + value_csv_string
                file_to_write.write(data_to_write)

            file_to_write.close()
            file_to_read.close()
Esempio n. 6
0
    def convert_gp_to_och(self, path_gp, path_och, name_of_dir):
        # path_gp 읽을 gp파일이 저장된 path를 string으로 저장
        # path_och och파일을 쓰고자 하는 path를 string으로 저장
        # name_of_dir 읽을 csv파일과 och파일을 쓰고자 하는 dir name을 string으로 저장

        path_gp = common_os_helper.check_slash(path_gp)
        path_och = common_os_helper.check_slash(path_och)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_gp = path_gp + name_of_dir + '*.gp'
        path_och = path_och + name_of_dir

        common_os_helper.create_dir(path_och)

        files_gp = glob.glob(path_gp)

        for file_gp in files_gp:
            file_och = path_och + file_gp[len(path_gp) - 4:]
            file_och = file_och[:len(file_och) - 2] + 'och'
            # 각 파일 마다 initialize 하여 GpToOchConvert Object를 생성 후 convert 실행
            GpToOchConverterObject = GpToOchConverter()
            GpToOchConverterObject.convertToOchFile(file_gp, file_och)
            # .och파일에 내용이 없으면 제거
            if os.path.getsize(file_och) < 1000:
                os.remove(file_och)
Esempio n. 7
0
    def look_up_files_stable(self, path_raw_data, path_write, name_of_dir):
        # 기기로부터 안정적으로 정보를 받아오지 않았다면 error로 판단, 기록

        path_raw_data = common_os_helper.check_slash(path_raw_data)
        path_write = common_os_helper.check_slash(path_write)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_raw_data = path_raw_data + name_of_dir
        path_write = path_write + name_of_dir

        error_list = []
        for player in self.Players:
            file = open(path_raw_data+str(player[0])+'.csv', 'r')
            read_values = file.readlines()

            valid_count = 0.0
            in_time = player[1].split(':')
            out_time = player[2].split(':')
            total_count = float(out_time[0])*60+float(out_time[1])-float(in_time[0])*60-float(in_time[1])
            for i in range(1, len(read_values), 600):
                time_str = read_values[i].split(',')[3:5]
                time_str = time_str[0]+':'+time_str[1]
                if (self.time_comparision(time_str, player[1], 1) >= 0) and (
                        self.time_comparision(time_str, player[2], 1) <= 0):
                    valid_count += 1.0

            # player가 뛴 시간의 90% 이하로 정보가 있다면 불안정하다고 판단
            if valid_count/total_count <= 0.8:
                error_list.append("Unstable,"+str(player[0])+",Input value lost")
            elif valid_count/total_count <= 0.95:
                error_list.append("Unstable,"+str(player[0])+",Some input value lost")
            else:
                error_list.append("Stable,"+str(player[0]))

        # error file에 기록
        write_order = "ErrorCode,ErrorValue,Detail\n"
        self.write_error(path_write, "device_stability.txt", write_order, error_list)
Esempio n. 8
0
    def read_csv_files(self, players, files_csv, path_csv_folder,
                       path_field_info):
        # csvfolder에 있는 csvfile들을 읽어들여서 활동 여부를 판단해주는 리스트를 만든다.
        path_csv_folder = common_os_helper.check_slash(path_csv_folder)

        file_read = open(path_field_info, 'r', encoding="utf-8")
        fields_info = file_read.readlines()

        for id, file_csv in enumerate(files_csv):
            field_info_list = fields_info[id + 1].split(',')
            player = []
            file_csv = file_csv.replace('\\', '/')
            filename = file_csv.replace(path_csv_folder, '')
            file_to_read = open(file_csv, 'r')
            read_values = file_to_read.readlines()
            data = read_values[1].split(',')
            check_time_temp = data[3:5]
            check_time_temp[0] = int(check_time_temp[0])  # hour
            check_time_temp[1] = int(check_time_temp[1])  # minute
            value_temp = data[6:9]
            value_temp[0] = float(value_temp[0])  # longitude
            value_temp[1] = float(value_temp[1])  # latitude
            value_temp[2] = float(value_temp[2])  # speed
            longi = value_temp[0]
            lati = value_temp[1]
            count = 1
            for read_value in read_values[2:]:
                data = read_value.split(
                    ',')  # csv형식의 파일을 ','단위로 parsing한 자료를 가진다.
                check_time = data[3:5]
                check_time[0] = int(check_time[0])  # hour
                check_time[1] = int(check_time[1])  # minute
                value = data[6:9]
                value[0] = float(value[0])  # longitude
                value[1] = float(value[1])  # latitude
                value[2] = float(value[2])  # speed

                if check_time == check_time_temp:  # 분단위가 같으면 계속 longi,lati,speed값을 더해나가고
                    for i, v in enumerate(value):
                        value_temp[i] = value_temp[i] + v
                    count = count + 1
                else:  # 만약 분단위가 달라지게 될 경우, 1분간 모은 자료에 대한 평균치의 위치와 속도로 활동여부를 판단해준다.
                    longi = float(value_temp[0]) / count
                    lati = float(value_temp[1]) / count
                    speed = float(value_temp[2]) / count
                    playing = self.check_activation(speed)
                    infield = self.check_in_field(longi, lati, field_info_list)
                    # 만약 속도와 위치 모두가 활동성이 있다고 확인되면 True고 아니면 False이다.
                    if playing and infield:
                        check = True
                    else:
                        check = False
                    player.append([
                        filename, check_time_temp[0], check_time_temp[1], check
                    ])
                    # 매 분마다 활동중인지 여부를 검사한 후 이를 배열로저장
                    check_time_temp = check_time
                    value_temp = value
                    count = 1
            players.append(
                player)  # 이렇게 읽어드린csv파일들을 player라는 형태의 list로 players에 저장
        return players
    def rename_csv_file(self, path_target_folder, path_read_info_folder,
                        path_read_xl, name_of_dir):
        # path_target_folder 이름을 변경하고자하는 target이 있는 folder path를 string으로 저장
        # path_read_info_folder serial_num,back_num으로 이루어진 .csv file이 있는 path를 string으로 저장
        # name_of_dir 파일을 읽고 쓸 dir name을 string으로 저장

        path_target_folder = common_os_helper.check_slash(path_target_folder)
        path_read_info_folder = common_os_helper.check_slash(
            path_read_info_folder)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_target_folder = path_target_folder + name_of_dir

        common_os_helper.create_dir(path_target_folder + 'noneed/')

        # 현재 target인 팀이 home인지 away인지 모르기 때문에 두가지 경우 모두 시도
        try:
            file_read_info = open(
                path_read_info_folder + self.find_file_name(name_of_dir, 'H'),
                'r')
        except FileNotFoundError:
            file_read_info = open(
                path_read_info_folder + self.find_file_name(name_of_dir, 'A'),
                'r')

        info_values = file_read_info.readlines()
        info_values.sort()
        index = -1
        serial_num = -1
        last = -1
        count = 0

        files_target = glob.glob(path_target_folder + '*.csv')
        for file_target in files_target:
            try:
                file_target = file_target.replace('\\', '/')
                name_list = file_target.split('/')
                target_num = int(name_list[len(name_list) - 1].split('_')[0])
            except:
                # filename이 변환되어 있는 경우 continue
                continue

            try:
                # target_num과 serial_num이 모두 정렬되어 있기 때문에 단순비교가 가능
                while target_num > serial_num:
                    index = index + 1
                    serial_num = int(info_values[index].split(',')[0])
                    back_num = info_values[index].split(',')[1]
                    back_num = back_num[:len(back_num) - 1]
                # 정렬된 상황에서 target_num < serial_num은 같은 번호를 가진 serial_num이 없다는 뜻이므로 noneed로 이동
                if target_num < serial_num:
                    shutil.move(
                        file_target, path_target_folder + 'noneed/' +
                        name_list[len(name_list) - 1])
                    continue
            except IndexError:
                shutil.move(
                    file_target, path_target_folder + 'noneed/' +
                    name_list[len(name_list) - 1])
                continue

            # 같은 serial number를 가진 파일이 여러개일 경우 (count)의 형식으로 이름에 추가
            if last == target_num:
                count = count + 1
                re_num = back_num + '(' + str(count) + ')'
            else:
                count = 0
                re_num = back_num
                last = target_num

            name_list[len(name_list) - 1] = re_num + '.csv'
            new_name = path_target_folder + name_list[len(name_list) - 1]
            os.rename(file_target, new_name)
    def cut_error(self, path_read_csv_folder, path_read_error_folder, path_write_folder, name_of_dir, ck_field=True, ck_dist=True, ck_speed=True):
        # path_read_csv_folder 읽을 .csv파일이 저장된 폴더 경로를 string으로 저장
        # path_read_error_folder 읽을 error.csv파일이 저장된 폴더 경로를 string으로 저장
        # path_write_folder error범위를 제외한 부분을 .csv로 저장할 폴더 경로를 string으로 저장
        # name_of_dir 파일을 읽고 쓸 dir name을 string으로 저장

        # 경로의 예외처리와 최종 경로 지정
        path_read_csv_folder = common_os_helper.check_slash(path_read_csv_folder)
        path_read_error_folder = common_os_helper.check_slash(path_read_error_folder)
        path_write_folder = common_os_helper.check_slash(path_write_folder)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_read_csv_folder = path_read_csv_folder + name_of_dir + '*.csv'
        path_read_error_folder = path_read_error_folder + name_of_dir + 'error.csv'
        path_write_folder = path_write_folder + name_of_dir

        # 파일을 쓸 위치에 폴더를 만들고 error.csv 열기
        common_os_helper.create_dir(path_write_folder)
        file_to_error_read = open(path_read_error_folder, 'r')
        read_error_values = file_to_error_read.readlines()
        index_error = 1
        read_error_value = read_error_values[index_error].split(',')

        files_read_csv = glob.glob(path_read_csv_folder)

        for file_read_csv in files_read_csv:
            file_name = file_read_csv[len(path_read_csv_folder) - 5:]
            file_write_csv = path_write_folder + file_name

            file_to_csv_read = open(file_read_csv, 'r')
            file_to_write = open(file_write_csv, 'w')

            read_csv_values = file_to_csv_read.readlines()
            file_to_write.write(read_csv_values[0])

            index_csv = 1
            while index_csv < len(read_csv_values):
                if read_error_value[1] == file_name and index_error < len(read_error_values):
                    csv_value_list = read_csv_values[index_csv].split(',')

                    time_str = csv_value_list[0]
                    for time_value in csv_value_list[1:6]:
                        time_str = time_str + '.' + time_value

                    term_int = -1
                    if read_error_value[4] == 'OverSpeed\n' and ck_speed:
                        term_int = 1
                    if read_error_value[4] == 'OverDist\n' and ck_dist:
                        term_int = 1
                    if read_error_value[4] == 'OutOfField\n' and ck_field:
                        term_int = 2

                    comp_result = self.time_comparision(time_str, read_error_value[2], read_error_value[3], term_int)
                    # 현재 읽은 줄의 시간이 error의 범위보다 큰쪽으로 벗어났다면 다음 error line에 대해 현재 읽은 줄을 확인
                    if comp_result == 1:
                        try:
                            index_csv = index_csv - 1
                            index_error = index_error + 1
                            read_error_value = read_error_values[index_error].split(',')
                        except IndexError:
                            # 마지막 error의 범위를 벗어났을 경우 .csv 파일의 나머지를 모두 출력
                            file_to_write.write(read_csv_values[index_csv])
                    if comp_result == -1:
                        file_to_write.write(read_csv_values[index_csv])

                # error의 정보가 현재 읽는 중인 file_name보다 작다면 error의 index를 증가시킨다.
                elif read_error_value[1] < file_name and index_error < len(read_error_values):
                    try:
                        index_csv = index_csv - 1
                        index_error = index_error + 1
                        read_error_value = read_error_values[index_error].split(',')
                    except IndexError:
                            # 마지막 error의 범위를 벗어났을 경우 .csv 파일의 나머지를 모두 출력
                        file_to_write.write(read_csv_values[index_csv])

                else:
                    file_to_write.write(read_csv_values[index_csv])

                index_csv = index_csv + 1

            file_to_csv_read.close()
            file_to_write.close()
        file_to_error_read.close()
    def summarize_csv(self, path_csv_folder, path_output_folder):
        #디렉토리가 없으면은 생성해준다.
        try:
            if not os.path.exists(path_output_folder):
                os.makedirs(path_output_folder)
        except OSError:
            print('Error: Creating directory.' + path_output_folder)
        path_csv_folder = common_os_helper.check_slash(path_csv_folder)
        path_output_folder = common_os_helper.check_slash(path_output_folder)
        files_csv = glob.glob(path_csv_folder + '*.csv')
        # csv파일의 첫줄에 들어갈 정보들을 순서대로 입력해주는 write_order
        write_order = 'year,month,day,hour,minute,second,longitude,latitude,speed,distance'
        for file_csv in files_csv:
            file_csv.replace('\\', '')

            file_summarized = path_output_folder + file_csv[len(path_csv_folder
                                                                ):]
            file_summarized = file_summarized[:len(file_summarized) -
                                              3] + 'csv'
            file_to_read = open(file_csv, 'r')
            file_to_write = open(file_summarized, 'w')
            file_to_write.writelines(write_order + '\n')

            read_values = file_to_read.readlines()
            data = read_values[1].split(',')
            #checktime은 초까지의 시간이 동일한 경우를 check하기 위해 0.1초단위는 버리고 초단위의 시간만 기록한다.
            check_time_temp = data[0:6]
            value_temp = data[7:10]
            value_temp.append(0)
            value_temp[0] = float(value_temp[0])  #longitude
            value_temp[1] = float(value_temp[1])  #latitude
            value_temp[2] = float(value_temp[2])

            count = 1
            # distance를 계산해주기 위한 좌표의 초기값 설정
            last_longi = value_temp[0]
            last_lati = value_temp[1]
            # csv파일을 읽어들이는 부분이다.
            for read_value in read_values[2:]:
                data = read_value.split(',')
                check_time = data[0:6]
                value = data[7:10]
                value.append(0)
                value[0] = float(value[0])  #longitude
                value[1] = float(value[1])  #latitude
                value[2] = float(value[2])

                if check_time == check_time_temp:  #만약 초단위까지의 시간이 같다면 그 값을 저장하고 계속해서 더해나간다.
                    for i, v in enumerate(value):
                        value_temp[i] = value_temp[i] + v
                    count = count + 1
                    #이 부분은 마지막 정보, 즉 최하단의 줄을 읽어드린 후의 값을 안적고 fileclose하는 것을 방지하기 위해 distance값을 보유하게 하는 것
                    value_temp[3] = self.measure_position(
                        last_lati, last_longi, value_temp[1] / count,
                        value_temp[0] / count)
                else:  #초단위까지의시간이 같지 않은경우, 즉 초가 바뀌었을때 연산 후 파일에다가 기록해준다.
                    value_temp[0] = float(value_temp[0]) / count  # longitude
                    value_temp[1] = float(value_temp[1]) / count  # latitude
                    value_temp[2] = float(value_temp[2]) / count
                    value_temp[3] = self.measure_position(
                        last_lati, last_longi, value_temp[1], value_temp[0])
                    last_longi = value_temp[0]
                    last_lati = value_temp[1]
                    # last,즉 이전 위도 경도 값을 남김으로서 다음에 들어온 값을 가지고 연산을 실행한다.
                    #현재의 시간정보를 기록
                    for time_idx, time_string in enumerate(
                            check_time_temp[:6]):
                        if time_idx == 0:
                            file_to_write.write(time_string)
                        else:
                            file_to_write.write(',' + time_string)
                    # write함수를 쓰기위해 value값들을 string으로 다시 형변환해준다.
                    value_temp[0] = str(value_temp[0])
                    value_temp[1] = str(value_temp[1])
                    value_temp[2] = str(value_temp[2])
                    value_temp[3] = str(value_temp[3])
                    # 이 후 value값들을 기록하고 temp들을 초기화 해준다.
                    for value_string in value_temp:
                        file_to_write.write(',' + value_string)
                    file_to_write.write('\n')

                    check_time_temp = check_time
                    value_temp = value
                    count = 1
            # 이부분은 반복문 안과 같지만 마지막 줄을 적어주기 위해 한줄을 추가하여 마지막줄의 연산까지 하는 것이다.
            for time_idx, time_string in enumerate(check_time_temp[:6]):
                if time_idx == 0:
                    file_to_write.write(time_string)
                else:
                    file_to_write.write(',' + time_string)
            value_temp[0] = value_temp[0] / count
            value_temp[1] = value_temp[1] / count
            value_temp[2] = value_temp[2] / count

            value_temp[0] = str(value_temp[0])
            value_temp[1] = str(value_temp[1])
            value_temp[2] = str(value_temp[2])
            value_temp[3] = str(value_temp[3])
            for value_string in value_temp:
                file_to_write.write(',' + value_string)
            file_to_write.write('\n')

            file_to_read.close()
    def find_noise_in_data(self, path_read_folder, path_read_field_folder, path_write_folder, name_of_dir):
        # path_read_folder 읽을 파일이 저장된 path를 string으로 저장
        # path_write_folder 파일을 쓰고자 하는 path를 string으로 저장
        # nmae_of_dir 읽을 파일과 쓰고자 하는 파일의 dir name을 string으로 저장

        path_read_folder = common_os_helper.check_slash(path_read_folder)
        path_read_field_folder = common_os_helper.check_slash(path_read_field_folder)
        path_write_folder = common_os_helper.check_slash(path_write_folder)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_read_folder = path_read_folder+name_of_dir
        path_read_field_folder = path_read_field_folder+name_of_dir
        path_write_folder = path_write_folder+name_of_dir

        file_to_read_field = open(path_read_field_folder+'fieldmatch.txt', 'r', encoding="utf-8")
        read_field = file_to_read_field.readline()

        common_os_helper.create_dir(path_write_folder)
        file_to_write = open(path_write_folder+'error.csv', 'w')
        write_order = 'path,filename,start_time,end_time,error_code\n'
        file_to_write.write(write_order)

        read_values_list = []
        read_files_name = []
        min_time = math.inf
        max_time = 0
        files_read = glob.glob(path_read_folder+'*.csv')
        for file_read in files_read:
            file_read = file_read.replace('\\','/')
            file_to_read = open(file_read, 'r')

            read_values = file_to_read.readlines()
            read_values_list.append(read_values[1:])

            error_list = []
            last_speed = 0
            id_speed = -1
            last_dist = 0
            id_dist = -1
            last_field = 0
            id_field = -1
            ck_field = 1
            try:
                read_field = file_to_read_field.readline()
                read_field_list = read_field.split(',')
                lonA, latA, lonB, latB, lonC, latC, lonD, latD = read_field_list[4:]
                pointA = (float(lonA[1:]), float(latA[1:]))
                pointB = (float(lonB[1:]), float(latB[1:]))
                pointC = (float(lonC[1:]), float(latC[1:]))
                pointD = (float(lonD[1:]), float(latD[1:len(latD)-2]))
                find_object = Find_field_csv()
                pointA, pointB, pointC, pointD = find_object.expand_field(pointA, pointB, pointC, pointD, 1.2)
            except:
                ck_field = 0

            value_csv_list = read_values[1].split(',')
            time_str = self.str_to_time(value_csv_list[:6])
            if self.time_to_second(time_str) < min_time:
                min_time = self.time_to_second(time_str)

            for value_list in read_values[1:]:
                value_csv_list = value_list.split(',')

                time_str = self.str_to_time(value_csv_list[:6])

                if self.time_to_second(time_str) < min_time:
                    min_time = self.time_to_second(time_str)

                speed_float = float(value_csv_list[8])
                # speed가 35보다 크게 변경된 순간에는 순간에는 list 형태로 start_time append
                # speed가 35보다 작게 변경된 순간에는 start_time을 append한 위치에 end_time과 error_code 작성
                if speed_float >= 35.0 and value_list != read_values[len(read_values)-1]:
                    if last_speed == 0:
                        last_speed = 1
                        error_list.append(time_str)
                        id_speed = len(error_list)-1
                else:
                    if last_speed == 1:
                        last_speed = 0
                        error_list[id_speed] = error_list[id_speed] + ',' + time_str + ',OverSpeed'

                dist_float = float(value_csv_list[9])
                # 1초에 이동한 dist가 15m보다 크게 변경된 순간에는 list 형태로 start_time append
                # 1초에 이동한 dist가 15m보다 작게 변경된 순간에는 start_time을 append한 위치에 end_time과 error_code 작성
                if dist_float >= 15 and value_list != read_values[len(read_values)-1]:
                    if last_dist == 0:
                        last_dist = 1
                        error_list.append(time_str)
                        id_dist = len(error_list)-1
                else:
                    if last_dist == 1:
                        last_dist = 0
                        error_list[id_dist] = error_list[id_dist] + ',' + time_str + ',OverDist'

                # field의 1.2배 크기 밖으로 나간 순간에는 list 형태로 start_time append
                # field의 1.2배 크기 안으로 들어간 순간에는 start_time을 append한 위치에 end_time과 error_code 작성
                longitude_float = float(value_csv_list[6])
                latitude_float = float(value_csv_list[7])
                pointP = (longitude_float, latitude_float)

                if (ck_field and find_object.checkPointInRectangle(pointP, pointA, pointB, pointC, pointD)) \
                        and value_list != read_values[len(read_values) - 1]:
                    if last_field == 0:
                        last_field = 1
                        error_list.append(time_str)
                        id_field = len(error_list)-1
                else:
                    if last_field == 1:
                        last_field = 0
                        error_list[id_field] = error_list[id_field] + ',' + time_str + ',OutOfField'

            if self.time_to_second(time_str) > max_time:
                max_time = self.time_to_second(time_str)

            file_list = file_read.split('/')
            file_name = file_list[len(file_list)-1]
            read_files_name.append(file_name[:len(file_name)-4])

            # file에서 읽어온 정보를 이용해 speed_error를 찾고 error.csv에 쓰기
            for error_str in error_list:
                file_to_write.write(path_read_folder+','+file_name+','+error_str+'\n')
            file_to_read.close()

        file_to_read_field.close()
        file_to_write.close()


        file_to_write_info = open(path_write_folder+'notice_device_info.txt', 'w', encoding="utf-8")
        write_order_info = 'player,state\n'
        file_to_write_info.write(write_order_info)

        state_list = self.check_gps_error(read_values_list, max_time, min_time)
        for id in range(len(read_files_name)):
            if state_list[id] == 0:
                state = ', Normal\n'
            elif state_list[id] <= 3:
                state = ', Doubt\n'
            else:
                state = ', Abnormal\n'
            file_to_write_info.write(read_files_name[id]+state)
        file_to_write_info.close()
Esempio n. 13
0
    def find_diff_log(self, path_read_xl_folder, path_read_log_folder, path_write_folder, name_of_dir):
        # excel file과 log.csv의 다른 부분을 error로 판단하여 file에 기록

        path_read_xl_folder = common_os_helper.check_slash(path_read_xl_folder)
        path_read_log_folder = common_os_helper.check_slash(path_read_log_folder)
        path_write_folder = common_os_helper.check_slash(path_write_folder)
        name_of_dir = common_os_helper.check_slash(name_of_dir)
        path_write_folder = path_write_folder+name_of_dir

        file_to_read_log = open(path_read_log_folder+name_of_dir+'log.csv')
        log_info_lists = file_to_read_log.readlines()

        # 경기가 home인지, away인지 모르기 때문에 둘 다 시행
        try:
            file_to_read_xl = openpyxl.load_workbook(path_read_xl_folder+self.find_file_name(name_of_dir,'H'))
        except:
            file_to_read_xl = openpyxl.load_workbook(path_read_xl_folder+self.find_file_name(name_of_dir, 'A'))

        active_sheet = file_to_read_xl.active
        player_sub = active_sheet['A11':'C17']
        start_time1 = active_sheet['A7'].value
        end_time1 = active_sheet['B7'].value
        start_time2 = active_sheet['D7'].value
        end_time2 = active_sheet['E7'].value

        start1 = log_info_lists[1].split(',')[1]
        self.START1 = start1
        error = self.time_comparision(start1, start_time1, 3)

        error_list = []
        if error != 0:
            error_list.append('TimeDiff,START1,incorrect')

        sub_in_list = []
        sub_out_list = []
        for row in player_sub:
            if row[0].value != row[1].value:
                time_list = row[0].value.split('+')

                time_int = 0
                for time_val in time_list:
                    time_int += int(time_val)

                if int(time_list[0]) <= 45:
                    time_str = self.time_calculate(start_time1, time_int, False)
                else:
                    time_str = self.time_calculate(start_time2, time_int-45, False)
                sub_in_list.append([int(row[1].value), time_str])
                sub_out_list.append([int(row[2].value), time_str])

        # log.csv에서 읽어온 내용과 excel file의 내용 비교
        sub_log_in_list = []
        sub_log_out_list = []
        for log_info in log_info_lists[2:]:
            log_list = log_info.split(',')
            if log_list[0] == 'END1':
                self.END1 = log_list[1]
                if self.time_comparision(log_list[1], end_time1, 3) != 0:
                    error_list.append('TimeDiff,END1,incorrect')
            if log_list[0] == 'START2':
                self.START2 = log_list[1]
                if self.time_comparision(log_list[1], start_time2, 3) != 0:
                    error_list.append('TimeDiff,START2,incorrect')
            if log_list[0] == 'END2':
                self.END2 = log_list[1]
                if self.time_comparision(log_list[1], end_time2, 3) != 0:
                    error_list.append('TimeDiff,END2,incorrect')
            if log_list[0] == 'SUB':
                try:
                    sub_log_in_list.append([int(log_list[3]), log_list[1]])
                    sub_log_out_list.append([int(log_list[2]), log_list[1]])
                except:
                    try:
                        sub_log_out_list.append([int(log_list[2]), log_list[1]])
                    except:
                        continue

        self.set_players_runtime(sub_log_in_list, sub_log_out_list)

        # sub된 선수들에 대해 log.csv와 excel file이 다른 부분이 있는지 확인, 기록
        error_code = [["Sub_InPlayerDiff,", ",Can't find at log"], ["Sub_InPlayerDiff,", "Can't find at info"],
                      ["Sub_InTimeDiff,", ",incorrect"]]
        error_list = self.list_compare(sub_in_list, sub_log_in_list, error_list, error_code)
        error_code = [["Sub_OutPlayerDiff,", ",Can't find at log"], ["Sub_OutPlayerDiff,", "Can't find at info"],
                      ["Sub_OutTimeDiff,", ",incorrect"]]
        error_list = self.list_compare(sub_out_list, sub_log_out_list, error_list, error_code)

        # error file에 기록
        write_order = 'ErrorCode,ErrorValue,Detail\n'
        self.write_error(path_write_folder, 'data_difference.txt', write_order, error_list)