62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""将 rocket launch counts.txt 数据导出为 CSV 文件"""
|
||
|
|
|
||
|
|
import csv
|
||
|
|
import re
|
||
|
|
|
||
|
|
|
||
|
|
def parse_header(header_line: str) -> list[str]:
|
||
|
|
"""从 # 开头的表头行解析列名"""
|
||
|
|
# 去掉开头的 # 和多余空格,按空白分割
|
||
|
|
clean = header_line.lstrip("#").strip()
|
||
|
|
# 列名之间可能有多空格,统一按空白分割
|
||
|
|
return re.split(r"\s{2,}", clean)
|
||
|
|
|
||
|
|
|
||
|
|
def parse_data_line(line: str) -> list[str]:
|
||
|
|
"""解析数据行,按空白分割"""
|
||
|
|
return line.split()
|
||
|
|
|
||
|
|
|
||
|
|
def main():
|
||
|
|
input_file = "rocket launch counts.txt"
|
||
|
|
output_file = "rocket_launch_counts.csv"
|
||
|
|
|
||
|
|
headers = None
|
||
|
|
rows = []
|
||
|
|
|
||
|
|
with open(input_file, "r", encoding="utf-8") as f:
|
||
|
|
for line in f:
|
||
|
|
line = line.rstrip("\n")
|
||
|
|
if not line.strip():
|
||
|
|
continue
|
||
|
|
if line.startswith("#"):
|
||
|
|
# 第二行是分隔线,第一行是列名
|
||
|
|
if "Bin" in line and "YDate" in line and headers is None:
|
||
|
|
headers = parse_header(line)
|
||
|
|
continue
|
||
|
|
# 数据行
|
||
|
|
values = parse_data_line(line)
|
||
|
|
if len(values) >= 4: # 至少包含 Bin, YDate, ValMin, ValMax
|
||
|
|
rows.append(values)
|
||
|
|
|
||
|
|
# 如果没有成功解析表头,使用默认列名
|
||
|
|
if headers is None or len(headers) != len(rows[0]) if rows else True:
|
||
|
|
headers = [
|
||
|
|
"Bin", "YDate", "ValMin", "ValMax",
|
||
|
|
"US", "SU", "RU", "CN", "F", "J", "AU", "D", "UK", "I",
|
||
|
|
"I-ELDO", "IN", "BR", "KR", "I-ESA", "KP", "IR", "IL", "CYM", "NZ",
|
||
|
|
"Total"
|
||
|
|
]
|
||
|
|
|
||
|
|
with open(output_file, "w", encoding="utf-8", newline="") as out:
|
||
|
|
writer = csv.writer(out)
|
||
|
|
writer.writerow(headers)
|
||
|
|
writer.writerows(rows)
|
||
|
|
|
||
|
|
print(f"已导出 {len(rows)} 行数据到 {output_file}")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|