Windows下csvstack工具如何用通配符批量合并大体积CSV文件?
解决Windows下csvstack通配符报错及大CSV导入SQLite的方案
一、解决csvstack的*.csv通配符报错问题
Windows命令行不会自动展开通配符,而csvstack依赖shell的通配符展开功能,直接用*.csv会触发OSError: [Errno 22] Invalid argument错误。可以用以下两种方式绕过:
1. PowerShell管道传递文件列表
PowerShell会自动解析通配符并输出具体文件路径,直接传给csvstack:
Get-ChildItem -Path "你的文件夹路径\*.csv" | ForEach-Object { $_.FullName } | csvstack > merged.csv
2. 生成文件列表后用csvstack的--file-list参数
先把所有CSV文件路径写入文本文件,再让csvstack读取这个列表:
rem 在CMD中执行 for %f in (你的文件夹路径\*.csv) do @echo %f >> filelist.txt csvstack --file-list filelist.txt > merged.csv
二、更高效的方案:跳过合并直接导入SQLite
150GB的合并CSV会占用大量磁盘空间,且导入SQLite时效率低下,推荐直接将每个CSV文件导入数据库,避免生成中间大文件。用Python脚本实现:
import sqlite3 import csv import os # 配置参数 DB_PATH = 'your_database.db' CSV_FOLDER = '你的CSV文件夹路径' BATCH_SIZE = 1000 # 批量插入行数,可根据内存调整 # 连接数据库 conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # 读取第一个文件表头,创建数据表 csv_files = [f for f in os.listdir(CSV_FOLDER) if f.lower().endswith('.csv')] if not csv_files: raise ValueError("文件夹中没有CSV文件") first_csv = os.path.join(CSV_FOLDER, csv_files[0]) with open(first_csv, 'r', encoding='utf-8', newline='') as f: reader = csv.reader(f) headers = next(reader) # 生成建表SQL(默认字段为TEXT类型,可根据实际数据类型调整) create_sql = f"CREATE TABLE IF NOT EXISTS dataset ({', '.join([f'{h} TEXT' for h in headers])})" cursor.execute(create_sql) # 遍历所有CSV文件,批量插入数据 for filename in csv_files: file_path = os.path.join(CSV_FOLDER, filename) print(f"正在导入: {filename}") with open(file_path, 'r', encoding='utf-8', newline='') as f: reader = csv.reader(f) next(reader) # 跳过表头 batch = [] for row in reader: batch.append(row) if len(batch) >= BATCH_SIZE: cursor.executemany( f"INSERT INTO dataset VALUES ({', '.join(['?' for _ in headers])})", batch ) conn.commit() batch = [] # 插入剩余行 if batch: cursor.executemany( f"INSERT INTO dataset VALUES ({', '.join(['?' for _ in headers])})", batch ) conn.commit() # 关闭连接 conn.close() print("所有文件导入完成")
脚本优势:
- 无需生成150GB的合并CSV,节省磁盘空间
- 批量插入减少数据库IO操作,提升导入效率
- 按批次读取数据,避免内存溢出
内容的提问来源于stack exchange,提问作者AKnum
相关产品推荐
相关产品推荐

