{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":4117,"databundleVersionId":46665,"sourceType":"competition"}],"dockerImageVersionId":31240,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\nimport subprocess\nfrom tqdm import tqdm\n\n# =========================\n# CONFIG\n# =========================\nCLASS_ID = 9                 # Lollipop\nFAMILY_NAME = \"Gatak\"\nCHUNK_SIZE = 500\nCHUNK_ID = 0                 # 🔴 CHANGE THIS PER NOTEBOOK\n\n# =========================\n# PATHS (Kaggle)\n# =========================\nINPUT_DIR = \"/kaggle/input/malware-classification\"\nARCHIVE_PATH = os.path.join(INPUT_DIR, \"train.7z\")\nLABEL_CSV = os.path.join(INPUT_DIR, \"trainLabels.csv\")\n\nWORK_DIR = \"/kaggle/working\"\nOUTPUT_DIR = os.path.join(WORK_DIR, \"asm_labeled\", FAMILY_NAME)\n\n# 7z output per chunk\nARCHIVE_OUT = os.path.join(\n    WORK_DIR,\n    f\"{FAMILY_NAME}_ASM_chunk_{CHUNK_ID}.7z\"\n)\n\n# =========================\n# PREPARE OUTPUT FOLDER\n# =========================\nos.makedirs(OUTPUT_DIR, exist_ok=True)\nprint(f\"✅ Output folder ready: {OUTPUT_DIR}\")\n\n# =========================\n# LOAD & FILTER CSV\n# =========================\ndf = pd.read_csv(LABEL_CSV)\ndf = df[df[\"Class\"] == CLASS_ID].reset_index(drop=True)\n\nTOTAL = len(df)\nSTART = CHUNK_ID * CHUNK_SIZE\nEND = min(START + CHUNK_SIZE, TOTAL)\n\nif START >= TOTAL:\n    raise ValueError(\"❌ Chunk ID exceeds available samples\")\n\nchunk_df = df.iloc[START:END]\n\nprint(f\"\\n📊 Family        : {FAMILY_NAME}\")\nprint(f\"📦 Total samples : {TOTAL}\")\nprint(f\"🔁 Chunk ID      : {CHUNK_ID}\")\nprint(f\"📂 Processing    : {START} → {END - 1}\")\nprint(f\"📄 Files in chunk: {len(chunk_df)}\")\n\n# =========================\n# EXTRACT ASM FILES\n# =========================\nextracted = 0\nfailed = 0\n\nfor _, row in tqdm(\n    chunk_df.iterrows(),\n    total=len(chunk_df),\n    desc=f\"Extracting {FAMILY_NAME} ASM\",\n    unit=\"file\"\n):\n    file_id = row[\"Id\"]\n    asm_path_in_7z = f\"train/{file_id}.asm\"\n\n    cmd = [\n        \"7z\", \"x\",\n        ARCHIVE_PATH,\n        asm_path_in_7z,\n        f\"-o{OUTPUT_DIR}\",\n        \"-y\"\n    ]\n\n    result = subprocess.run(\n        cmd,\n        stdout=subprocess.DEVNULL,\n        stderr=subprocess.DEVNULL\n    )\n\n    if result.returncode == 0:\n        extracted += 1\n    else:\n        failed += 1\n\n# =========================\n# CREATE 7z ARCHIVE\n# =========================\nprint(\"\\n📦 Compressing chunk to 7z...\")\n\nsubprocess.run(\n    [\n        \"7z\", \"a\", \"-t7z\", \"-y\",\n        ARCHIVE_OUT,\n        OUTPUT_DIR\n    ],\n    stdout=subprocess.DEVNULL,\n    stderr=subprocess.DEVNULL\n)\n\n# =========================\n# CLEANUP (IMPORTANT)\n# =========================\nprint(\"🧹 Cleaning temporary extracted files...\")\nsubprocess.run([\"rm\", \"-rf\", OUTPUT_DIR])\n\n# =========================\n# SUMMARY\n# =========================\nprint(\"\\n✅ CHUNK COMPLETE\")\nprint(f\"📁 Extracted ASM  : {extracted}\")\nprint(f\"❌ Failed         : {failed}\")\nprint(f\"📦 7z archive     : {ARCHIVE_OUT}\")\nprint(\"\\n🎉 READY FOR DOWNLOAD\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-19T20:15:22.107438Z","iopub.execute_input":"2025-12-19T20:15:22.107709Z","iopub.status.idle":"2025-12-19T21:37:41.339316Z","shell.execute_reply.started":"2025-12-19T20:15:22.107684Z","shell.execute_reply":"2025-12-19T21:37:41.338406Z"}},"outputs":[],"execution_count":null}]}