Files

72 lines
2.0 KiB
Python

import csv
import sys
from collections import defaultdict
COLUMNS = ["provider", "protocol", "dnssec_mode", "query_type", "keep_alive"]
def get_uncovered_values(rows, selected_indices, col_indices, all_values):
covered = defaultdict(set)
for idx in selected_indices:
for col, col_idx in col_indices.items():
covered[col].add(rows[idx][col_idx])
uncovered = {}
for col in COLUMNS:
uncovered[col] = all_values[col] - covered[col]
return uncovered
def main(input_file, output_file):
with open(input_file, newline="") as f:
reader = csv.reader(f)
header = next(reader)
rows = list(reader)
col_indices = {col: header.index(col) for col in COLUMNS}
# Collect all unique values per column
all_values = defaultdict(set)
for row in rows:
for col, idx in col_indices.items():
all_values[col].add(row[idx])
# Greedy set cover
selected = []
uncovered = get_uncovered_values(rows, selected, col_indices, all_values)
while any(uncovered.values()):
best_row = None
best_score = 0
for i, row in enumerate(rows):
if i in selected:
continue
score = sum(
1 for col, idx in col_indices.items() if row[idx] in uncovered[col]
)
if score > best_score:
best_score = score
best_row = i
if best_row is None:
break
selected.append(best_row)
uncovered = get_uncovered_values(rows, selected, col_indices, all_values)
with open(output_file, "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(header)
for idx in selected:
writer.writerow(rows[idx])
print(f"Selected {len(selected)} rows out of {len(rows)}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python minimize_csv.py input.csv output.csv")
sys.exit(1)
main(sys.argv[1], sys.argv[2])