81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
|
|
def load_single_bid_json_matrix(json_path):
|
|
|
|
data_file = Path(json_path)
|
|
if not data_file.exists():
|
|
raise FileNotFoundError(f"JSON input file not found: {data_file}")
|
|
|
|
with data_file.open("r", encoding="utf-8") as file:
|
|
payload = json.load(file)
|
|
|
|
if "matrix" in payload:
|
|
matrix = [[_to_text(value) for value in row] for row in payload["matrix"]]
|
|
elif "slot_range" in payload:
|
|
matrix = _build_range_matrix(payload)
|
|
else:
|
|
price_row = [_to_text(value) for value in payload["price_row"]]
|
|
slot_rows = [
|
|
[_to_text(value) for value in slot["orders"]]
|
|
for slot in payload.get("slots", [])
|
|
]
|
|
matrix = [price_row, *slot_rows]
|
|
|
|
if not matrix or not matrix[0]:
|
|
raise ValueError(f"No bidding data found in {data_file}.")
|
|
|
|
tsv = "\n".join("\t".join(row) for row in matrix)
|
|
return {
|
|
"matrix": matrix,
|
|
"tsv": tsv,
|
|
"row_count": len(matrix),
|
|
"column_count": len(matrix[0]),
|
|
"first_value": matrix[0][0],
|
|
}
|
|
|
|
|
|
def _build_range_matrix(payload):
|
|
|
|
price_row = [_to_text(value) for value in payload["price_row"]]
|
|
slot_range = payload["slot_range"]
|
|
from_slot = int(slot_range["from_slot"])
|
|
to_slot = int(slot_range["to_slot"])
|
|
orders = payload.get("orders", [])
|
|
|
|
if from_slot < 1 or to_slot < from_slot:
|
|
raise ValueError(f"Invalid slot_range: from_slot={from_slot}, to_slot={to_slot}")
|
|
|
|
expected_row_count = to_slot - from_slot + 1
|
|
if len(orders) != expected_row_count:
|
|
raise ValueError(
|
|
"Order row count does not match slot range: "
|
|
f"expected {expected_row_count}, found {len(orders)}"
|
|
)
|
|
|
|
column_count = len(price_row)
|
|
blank_row = [""] * column_count
|
|
|
|
slot_rows = []
|
|
for _ in range(from_slot - 1):
|
|
slot_rows.append(blank_row.copy())
|
|
|
|
for order_row in orders:
|
|
normalized_row = [_to_text(value) for value in order_row]
|
|
if len(normalized_row) != column_count:
|
|
raise ValueError(
|
|
"Each order row must have the same number of values as price_row: "
|
|
f"expected {column_count}, found {len(normalized_row)}"
|
|
)
|
|
slot_rows.append(normalized_row)
|
|
|
|
return [price_row, *slot_rows]
|
|
|
|
|
|
def _to_text(value):
|
|
|
|
if value is None:
|
|
return ""
|
|
return str(value)
|