72 lines
2.0 KiB
Python
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])
|