如何提取出文件夹中同种类型文件,并分类保存

作者分享了一个MATLAB开发过程中使用的bat脚本,用于自动整理和筛选生成的大量.c、.h和.arxml文件,减少手动操作的麻烦,实现快速复制和清理。

最近在开发时使用MATLAB自动生成autosar C代码时,需要提取出生成的.c .h .arxml 自动生成的文件夹实在太多,虽然知道代码的位置,又不想一个一个的点开ctrl+c v,就自己看了看bat的语法自己写了一个bat程序。略显出错但功能好用QvQ
举个栗子
这是整理过后的.c .h的代码量在这里插入图片描述
237个非常的多复制起来就很麻烦,还存在与很多个MATLAB自己创建的文件夹,而且这就是一个模型,可能还有个七八个模型,就很烦。
废话说多了,接下来正式介绍一下我的bat。

@echo off
rd /s /q _code
rd /s /q _arxml
pause
set current_dir=%cd%
mkdir _code 
mkdir _arxml

首先先把原始创建的两个文件夹删除,在创建一个新的同名文件夹。如果不删除可能会出现覆盖不全或者没有覆盖的情况。

for /d %%a in (*) do (
	echo 操作目标文件: "%%a"
	::排除stub文件夹复制其他文件  stub可更改为其他名字
	if not EXIST stub copy %%a _code

		else (
			echo cp  "%%a"
		)
)

之后对bat所处文件夹进行全部复制的一个过程,至于为什么加了这一句 if not EXIST stub copy %%a _code是因为在stub文件夹下还存在一些.c .h文件是我们不需要的一些东西所以加了一句,在复制的时候排除stub文件夹下的文件。
这就完成了一半,简单粗暴地把所有东西全部塞到了_code里面,顺便还把stub里的文件筛出去了。之后我们再把_code里面的文件做一次筛选就OK了。

for /f "delims=" %%a in ('dir /b/s/a-d .\_code') do (
if /i not "%%~nxa"=="%~nx0" (
if /i not "%%~xa"==".c" (
if /i not "%%~xa"==".h" (
if /i not "%%~xa"==".arxml" (del /a/q/f "%%a")))))

这一段应该不难理解,就是将_code里面的文件再次进行筛选,将.c .h .arxml三种类型文件筛出来,将其他文件进行删除。

MOVE /Y  .\_code\*.arxml .\_arxml

del .\_code\*.arxml
pause

最后就是将_code 里面的所有arxml文件移动到_arxml文件夹中并删除_code中的arxml文件
然后我们用一下bat生成一个mulv.txt文件在进行下对比在这里插入图片描述
发现我们使用脚本生成的_code与手拉出来的xxx_code文件完全相同。
简单粗暴好用~~!!
后附上完整代码

@echo off
rd /s /q _code
rd /s /q _arxml
pause
:: current_dir目录为当前路径
set current_dir=%cd%
:: 创建_code _arxml两个文件夹
mkdir _code 
mkdir _arxml

for /d %%a in (*) do (
	echo 操作目标文件: "%%a"
	if not EXIST stub copy %%a _code

		else (
			echo cp  "%%a"
		)
)
for /f "delims=" %%a in ('dir /b/s/a-d .\_code') do (
if /i not "%%~nxa"=="%~nx0" (
if /i not "%%~xa"==".c" (
if /i not "%%~xa"==".h" (
if /i not "%%~xa"==".arxml" (del /a/q/f "%%a")))))

MOVE /Y  .\_code\*.arxml .\_arxml

del .\_code\*.arxml
pause
import tkinter as tk from tkinter import filedialog from pathlib import Path from docx import Document from openpyxl import Workbook def get_colspan(cell): """安全获取列合跨度""" try: return cell._tc.grid_span except AttributeError: return 1 def process_table(table): """精确解析表格结构""" # 计算实际最大列数 max_cols = 0 for row in table.rows: current_cols = 0 for cell in row.cells: current_cols += get_colspan(cell) max_cols = max(max_cols, current_cols) # 初始化网格 grid = [] for row in table.rows: current_row = [None] * max_cols col_cursor = 0 for cell in row.cells: # 跳过已填充列 while col_cursor < max_cols and current_row[col_cursor] is not None: col_cursor += 1 # 处理合列 colspan = get_colspan(cell) text = cell.text.strip() or "" # 确保空字符串 # 填充单元格 for i in range(colspan): if col_cursor + i < max_cols: current_row[col_cursor + i] = text col_cursor += colspan grid.append(current_row) # 平铺数据替换None为空字符串 return [cell if cell is not None else "" for row in grid for cell in row] def save_to_excel(data, output_path): """分页保存超大Excel文件""" MAX_COLUMNS = 16384 # Excel最大列限制 wb = Workbook() wb.remove(wb.active) # 删除默认工作表 # 拆分数据到多个工作表 for part_index in range(0, len(data), MAX_COLUMNS): part_data = data[part_index:part_index + MAX_COLUMNS] # 创建新工作表 ws = wb.create_sheet(title=f"Part{part_index//MAX_COLUMNS + 1}") # 写入数据到第一行 for col_idx, value in enumerate(part_data, 1): ws.cell(row=1, column=col_idx, value=value) wb.save(output_path) def process_docx_files(): root = tk.Tk() root.withdraw() # 选择文件夹 folder_path = filedialog.askdirectory(title="请选择包含docx文件文件夹") if not folder_path: print("操作已取消") return # 处理文件 for docx_path in Path(folder_path).glob("*.docx"): try: doc = Document(docx_path) all_data = [] # 提取所有表格数据 for table in doc.tables: table_data = process_table(table) if table_data: all_data.extend(table_data) if not all_data: print(f"跳过无表格文件:{docx_path.name}") continue # 生成输路径 output_path = docx_path.with_name(f"{docx_path.stem}_横向结果.xlsx") # 保存Excel文件 save_to_excel(all_data, output_path) print(f"成功保存:{output_path.name}") except Exception as e: print(f"处理失败:{docx_path.name} - {str(e)}") if __name__ == "__main__": process_docx_files() print("\n处理完成!") input("按回车键退...")上述代码能成功运行生成xlsx文件,但仅处理了文件夹第一个docx文件且生成的xlsx文件中同一个值有9个单元格都是一样的重复值,还有大部分空白单元格,请将代码改进能够处理文件夹里的多个文件,仅生成的一个去重去空白单元格的xlsx文件
最新发布
03-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值