You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:25:01