Files
sisvietnamvn_01/parse_sql.py
T

90 lines
3.5 KiB
Python

import re
import csv
from ast import literal_eval
def parse_sql_dump(filepath, table_name):
# This is a robust parser for phpMyAdmin SQL dumps
# It finds INSERT INTO `table_name` and extracts rows.
in_insert = False
columns = []
rows = []
with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
if line.startswith(f"INSERT INTO `{table_name}`"):
# Extract columns
col_match = re.search(r'\((.*?)\)', line)
if col_match:
columns = [c.strip('` ') for c in col_match.group(1).split(',')]
# Extract values part
val_str = line[line.find("VALUES") + 6:].strip().rstrip(';')
# We need to split by `), (` but be careful about strings.
# A robust way is to use a state machine
state = 'out'
current_row = []
current_val = []
escape = False
i = 0
while i < len(val_str):
c = val_str[i]
if state == 'out':
if c == '(':
state = 'in_row'
current_row = []
current_val = []
elif state == 'in_row':
if c == "'":
if escape:
current_val.append(c)
escape = False
else:
state = 'in_string'
elif c == ',':
current_row.append("".join(current_val).strip())
current_val = []
elif c == ')':
current_row.append("".join(current_val).strip())
rows.append(dict(zip(columns, current_row)))
state = 'out'
elif c != ' ':
current_val.append(c)
elif state == 'in_string':
if c == "'":
if i + 1 < len(val_str) and val_str[i+1] == "'":
current_val.append("'")
i += 1 # skip next
else:
state = 'in_row'
elif c == '\\':
escape = True
else:
if escape:
if c == 'n': current_val.append('\n')
elif c == 'r': current_val.append('\r')
elif c == 't': current_val.append('\t')
else: current_val.append(c)
escape = False
else:
current_val.append(c)
i += 1
return rows
print("Parsing sis_posts...")
posts = parse_sql_dump("sisvietnamvn_Trang chính thức hiện tại/Database/sisvietnam_db.sql", "sis_posts")
print(f"Found {len(posts)} posts.")
# Let's count by post_type
types = {}
for p in posts:
pt = p.get('post_type', 'unknown')
if pt.startswith("'") and pt.endswith("'"):
pt = pt[1:-1]
types[pt] = types.get(pt, 0) + 1
for t, c in types.items():
print(f" {t}: {c}")