""" Takes the given csv bulk file and splits up the file details into separate columns to make it easier to load into a relational db """ import csv import json import sys # added this to avoid an error when processing a large amount of data field_size_limit = sys.maxsize while True: try: csv.field_size_limit(field_size_limit) break except OverflowError: field_size_limit = int(field_size_limit / 10) def file_details_from_acr_filename(filename): parts = filename.split('_') assert len(parts) == 6 return [ parts[0], parts[1], parts[2], parts[3], parts[4].upper(), int(parts[5]) ] def main(): input_filename = sys.argv[1] output_filename = sys.argv[2] tracks = dict() with open(input_filename) as read_file: reader = csv.reader(read_file, delimiter='\t', quoting=csv.QUOTE_NONE) next(reader) # skip header for line in reader: acr_id = line[0] file_list_str = line[1] file_list = json.loads(file_list_str) assert type(file_list) == list for filename in file_list: sr_row = [] sr_row.append(acr_id) file_details = file_details_from_acr_filename(filename) for file_detail in file_details: sr_row.append(file_detail) tuid = int(sr_row[4]) if tuid == 14908799: continue if tuid not in tracks: tracks[tuid] = sr_row else: if tracks[tuid][-1] > sr_row[-1]: tracks[tuid] = sr_row with open(output_filename, 'w', newline='') as write_file: writer = csv.writer(write_file, delimiter=',') for _, final_row in tracks.items(): writer.writerow(final_row) if __name__ == "__main__": main()