import re
def load_device_list(file_path):
"""Wczytuje listę urządzeń z pliku."""
with open(file_path, 'r', encoding='utf-8') as file:
lines = [line.strip() for line in file if line.strip()]
return lines
def parse_devices(lines):
"""Grupuje urządzenia według ID, pomijając te, które już mają opis."""
devices = {}
for line in lines:
if '-' in line: # Pomija urządzenia, które już mają opis
continue
match = re.match(r'rs\.0\.id\.(\d+)', line)
if match:
device_id = match.group(1)
if device_id not in devices:
devices[device_id] = []
devices[device_id].append(line)
return devices
def load_existing_descriptions(file_path):
"""Wczytuje istniejące opisy z pliku wynikowego."""
try:
with open(file_path, 'r', encoding='utf-8') as file:
return {line.split(" - ")[0].strip(): line.strip() for line in file if " - " in line}
except FileNotFoundError:
return {}
def generate_descriptions(devices, existing_descriptions):
"""Interaktywnie generuje opisy dla urządzeń."""
descriptions = {}
try:
for device_id, components in devices.items():
print(f"\nID urządzenia: {device_id}")
# Generowanie opisu głównego urządzenia
if f"id {device_id}" in existing_descriptions:
current_desc = existing_descriptions[f"id {device_id}"]
print(f"Obecny opis: {current_desc.split(' - ', 1)[1]}")
modify = input("Czy chcesz zmodyfikować ten opis? (tak/nie): ").strip().lower()
if modify == "nie":
continue
else:
description = input(f"Podaj nowy opis dla ID {device_id} (np. wiatrołap/kuchnia): ").strip()
if not description:
description = "brak"
descriptions[device_id] = {f"id {device_id}": description}
# Generowanie opisów dla komponentów urządzenia
for component in components:
if component in existing_descriptions:
current_desc = existing_descriptions[component]
print(f"Obecny opis: {current_desc.split(' - ', 1)[1]}")
modify = input(f"Czy chcesz zmodyfikować opis dla {component}? (tak/nie): ").strip().lower()
if modify == "nie":
continue
component_desc = input(f"Podaj opis dla {component}: ").strip()
if not component_desc:
component_desc = "brak"
descriptions.setdefault(device_id, {})[component] = component_desc
except (KeyboardInterrupt, EOFError): # Obsługuje Ctrl+C i Ctrl+Z
print("\nZatrzymano interakcję. Zapisywanie danych...")
return descriptions, True
return descriptions, False
def save_descriptions(file_path, descriptions, original_lines, existing_descriptions):
"""Zapisuje opisy do pliku, zachowując istniejącą strukturę."""
with open(file_path, 'w', encoding='utf-8') as file:
for line in original_lines:
if '-' in line:
file.write(line + '\n')
continue
if line in existing_descriptions:
file.write(existing_descriptions[line] + '\n')
continue
match = re.match(r'rs\.0\.id\.(\d+)', line)
if match:
device_id = match.group(1)
if device_id in descriptions and line in descriptions[device_id]:
file.write(f"{line} - {descriptions[device_id][line]}\n")
else:
file.write(line + '\n')
else:
file.write(line + '\n')
def main():
input_file = 'dok.txt'
output_file = 'dok_output.txt'
print("Wczytywanie urządzeń i istniejących opisów...")
original_lines = load_device_list(input_file)
devices = parse_devices(original_lines)
existing_descriptions = load_existing_descriptions(output_file)
if not devices:
print("Brak urządzeń do opisania.")
return
print(f"Znaleziono {len(devices)} urządzeń do opisania.")
all_descriptions = {}
while devices:
descriptions, should_exit = generate_descriptions(devices, existing_descriptions)
all_descriptions.update(descriptions)
if should_exit:
break
print("\nZapisywanie opisów do pliku...")
save_descriptions(output_file, all_descriptions, original_lines, existing_descriptions)
print(f"Opisy zapisano w pliku {output_file}.")
print("Zakończono.")
if __name__ == "__main__":
main()