79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
|
|
def convert_hq_entries(csv_path: Path, backup: bool = True) -> None:
|
|
"""Convert HQ1:,HQ2:,HQ3: columns in the desynthesis recipes CSV into a
|
|
single JSON-like dictionary string stored in the HQ column.
|
|
|
|
The CSV currently looks like::
|
|
Item,Crystal,Ingredients,HQ,Cap
|
|
Distilled Water x3,Lightning,Tahrongi Cactus,HQ1: Distilled Water x6,HQ2: Distilled Water x9,HQ3: Distilled Waterx12,2
|
|
|
|
After conversion it will be::
|
|
Distilled Water x3,Lightning,Tahrongi Cactus,{"HQ1":"Distilled Water x6","HQ2":"Distilled Water x9","HQ3":"Distilled Waterx12"},2
|
|
"""
|
|
csv_path = Path(csv_path)
|
|
if not csv_path.exists():
|
|
raise FileNotFoundError(csv_path)
|
|
|
|
text = csv_path.read_text(encoding="utf-8").splitlines()
|
|
output_lines = []
|
|
|
|
for line in text:
|
|
# Keep skill category lines (e.g., "Alchemy") unchanged.
|
|
if "," not in line:
|
|
output_lines.append(line)
|
|
continue
|
|
|
|
parts = [p.strip() for p in line.split(",")]
|
|
|
|
# The header line already has correct length (5).
|
|
if parts[:5] == ["Item", "Crystal", "Ingredients", "HQ", "Cap"]:
|
|
output_lines.append(",".join(parts))
|
|
continue
|
|
|
|
# If this row already has 5 columns, leave as-is.
|
|
if len(parts) <= 5:
|
|
output_lines.append(",".join(parts))
|
|
continue
|
|
|
|
# Otherwise consolidate HQ columns.
|
|
item, crystal, ingredients = parts[:3]
|
|
cap = parts[-1]
|
|
hq_parts = parts[3:-1]
|
|
|
|
hq_dict = {}
|
|
unnamed_counter = 1
|
|
for h in hq_parts:
|
|
h = h.strip()
|
|
if not h:
|
|
continue
|
|
if ":" in h:
|
|
key, value = h.split(":", 1)
|
|
hq_dict[key.strip()] = value.strip()
|
|
else:
|
|
# Handle unlabeled HQ values by assigning sequential keys.
|
|
key = f"HQ{unnamed_counter}"
|
|
unnamed_counter += 1
|
|
hq_dict[key] = h
|
|
|
|
# Build dictionary string with spaces after commas to match example formatting.
|
|
hq_json_readable = "{" + ",".join([f'"{k}": "{v}"' if "\"" not in v else f'"{k}": {json.dumps(v)}' for k, v in hq_dict.items()]) + "}"
|
|
|
|
new_line = ",".join([item, crystal, ingredients, hq_json_readable, cap])
|
|
output_lines.append(new_line)
|
|
|
|
# Backup original file.
|
|
if backup:
|
|
backup_path = csv_path.with_suffix(csv_path.suffix + ".bak")
|
|
if not backup_path.exists():
|
|
backup_path.write_text("\n".join(text), encoding="utf-8")
|
|
|
|
csv_path.write_text("\n".join(output_lines) + "\n", encoding="utf-8")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
target = Path(__file__).resolve().parents[1] / "datasets" / "desythesis_recipes.csv"
|
|
convert_hq_entries(target)
|