55 lines
2.5 KiB
Python
55 lines
2.5 KiB
Python
import csv
|
|
failed_rows = []
|
|
unique_addresses = {}
|
|
|
|
with open('input.csv', 'r') as in_file, open('output.csv', 'w', newline='') as out_file, open('failedoutputs.csv', 'w', newline='') as fail_file:
|
|
|
|
|
|
csv_reader = csv.DictReader(in_file)
|
|
csv_writer = csv.writer(out_file)
|
|
fail_writer = csv.writer(fail_file)
|
|
|
|
|
|
csv_writer.writerow(['Time Stamp', 'ID', 'Extended', 'Dir', 'Bus', 'LEN', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8'])
|
|
fail_writer.writerow(['Time Stamp', 'ID', 'Extended', 'Dir', 'Bus', 'LEN', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8'])
|
|
|
|
for row in csv_reader:
|
|
d_values = [int(row[f"D{i}"], 16) for i in range(2, 9)]
|
|
checksum = sum(d_values) + int(row['ID'], 16)
|
|
checksum = (checksum & 0xFF) + (checksum >> 8)
|
|
d1 = int(row['D1'], 16)
|
|
if d1 <= checksum or (d1 > checksum and d1 - checksum == 256):
|
|
address = row['ID']
|
|
if address not in unique_addresses:
|
|
|
|
csv_writer.writerow([row['Time Stamp'], row['ID'], row['Extended'], row['Dir'], row['Bus'], row['LEN'], row['D1'], row['D2'], row['D3'], row['D4'], row['D5'], row['D6'], row['D7'], row['D8']])
|
|
unique_addresses[address] = [1, 0]
|
|
else:
|
|
unique_addresses[address][0] += 1
|
|
else:
|
|
failed_rows.append(row)
|
|
fail_writer.writerow([row['Time Stamp'], row['ID'], row['Extended'], row['Dir'], row['Bus'], row['LEN'], row['D1'], row['D2'], row['D3'], row['D4'], row['D5'], row['D6'], row['D7'], row['D8']])
|
|
|
|
address = row['ID']
|
|
if address not in unique_addresses:
|
|
unique_addresses[address] = [0, 1]
|
|
else:
|
|
unique_addresses[address][1] += 1
|
|
for row in failed_rows:
|
|
address = row['ID']
|
|
d1 = int(row['D1'], 16)
|
|
d8 = int(row['D8'], 16)
|
|
if address not in unique_addresses:
|
|
unique_addresses[address] = [0, 1, 0, 0] # Initialize with D1 and D8 matched counts set to 0
|
|
if is_d1_checksum:
|
|
unique_addresses[address][2] += 1
|
|
if is_d8_checksum:
|
|
unique_addresses[address][3] += 1
|
|
|
|
sorted_addresses = sorted(unique_addresses.items(), key=lambda x: x[1][0], reverse=True)
|
|
print("Address Successes Failures Total D1_Matched D8_Matched")
|
|
for address, counts in sorted_addresses:
|
|
total = counts[0] + counts[1]
|
|
if total > 0:
|
|
print(f"{address} {counts[0]} {counts[1]} {total} {counts[2]} {counts[3]}")
|