File size: 2,135 Bytes
bcb314a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# src/prepare_data.py
from pathlib import Path
import pandas as pd
import re

from src.data_cleaning import prepare_dataframe

PROJECT_ROOT = Path(__file__).resolve().parents[1]
INPUT_PATH  = PROJECT_ROOT / "data" / "raw" / "Данные для кейса.csv"
OUTPUT_PATH = PROJECT_ROOT / "data" / "processed" / "clean_data.csv"

ENCODINGS = ["utf-8-sig", "utf-8", "cp1251", "windows-1251", "koi8-r", "iso-8859-5"]
SEPARATORS = [",", ";", "\t", "|"]

def has_cyrillic(s: str) -> bool:
    return bool(re.search(r"[А-Яа-яЁё]", s))

def smart_read_csv(path: Path) -> tuple[pd.DataFrame, str, str]:
    best = None
    for enc in ENCODINGS:
        for sep in SEPARATORS:
            try:
                df = pd.read_csv(path, encoding=enc, sep=sep)
                cols_joined = " ".join(map(str, df.columns))
                if df.shape[1] > 1 and has_cyrillic(cols_joined):
                    print(f"[i] Выбраны encoding='{enc}', sep='{sep}'")
                    return df, enc, sep
                # запомним хоть какой-то валидный вариант на случай без кириллицы
                if best is None and df.shape[1] > 1:
                    best = (df, enc, sep)
            except Exception:
                pass
    if best:
        print("[!] Кириллица в заголовках не обнаружена, берём первый валидный вариант.")
        return best
    raise RuntimeError("Не удалось прочитать CSV: перепроверьте файл и кодировку.")

def main():
    if not INPUT_PATH.exists():
        raise FileNotFoundError(f"Не найден файл: {INPUT_PATH}")

    df, enc, sep = smart_read_csv(INPUT_PATH)
    print(f"[i] колонки: {list(df.columns)}")
    print(f"[i] размер: {df.shape}")

    clean_df = prepare_dataframe(df)
    OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
    clean_df.to_csv(OUTPUT_PATH, index=False, encoding="utf-8-sig")
    print(f"✅ Готово: {OUTPUT_PATH}")
    print(clean_df.head(3))

if __name__ == "__main__":
    main()