You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何导入单字段CSV文件并从文件名提取数据补充至MySQL表?

批量导入带命名规则的CSV到MySQL并补充文件名解析字段

我来给你一套实用的实现方案,不管是用脚本灵活处理还是用MySQL原生工具高效导入都能搞定,分两种常见场景来说明:


方法一:用Python脚本(灵活可控,适配复杂规则)

这种方式能轻松解析文件名规则,还能处理CSV格式的各种细节,步骤如下:

  1. 解析文件名提取标识字段
    针对你提到的T001U020C075.csv这类命名,我们可以通过字符串拆分把标识映射到数据库字段,比如test_id=T001user_id=U020channel_id=C075

    import os
    import csv
    import mysql.connector
    
    # 定义文件名解析逻辑
    def parse_filename(filename):
        base_name = os.path.splitext(filename)[0]
        # 按固定长度拆分(假设每个标识都是4位,比如前缀+3位数字)
        test_id = base_name[0:4]
        user_id = base_name[4:8]
        channel_id = base_name[8:12]
        return test_id, user_id, channel_id
    
  2. 连接数据库批量插入数据
    遍历目标文件夹里的所有CSV,读取每一行测试结果,加上解析出的标识字段,批量插入到数据库表中:

    # 数据库连接配置
    db_config = {
        'host': '你的数据库地址',
        'user': '数据库用户名',
        'password': '数据库密码',
        'database': '目标数据库名'
    }
    
    # CSV文件所在文件夹路径
    csv_folder = '/path/to/your/csv/directory'
    
    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor()
    
    # 假设数据库表结构为:test_id, user_id, channel_id, result1, result2, result3
    insert_sql = """
        INSERT INTO test_results (test_id, user_id, channel_id, result1, result2, result3)
        VALUES (%s, %s, %s, %s, %s, %s)
    """
    
    for filename in os.listdir(csv_folder):
        if filename.endswith('.csv'):
            test_id, user_id, channel_id = parse_filename(filename)
            csv_path = os.path.join(csv_folder, filename)
            with open(csv_path, 'r', encoding='utf-8') as f:
                reader = csv.reader(f)
                # 跳过CSV表头(如果你的文件有表头的话)
                next(reader)
                # 准备批量插入的数据
                batch_data = []
                for row in reader:
                    # 把解析的标识字段和CSV行数据合并
                    batch_data.append((test_id, user_id, channel_id) + tuple(row))
                # 执行批量插入
                cursor.executemany(insert_sql, batch_data)
                conn.commit()
                print(f"成功导入 {filename} 中的 {len(batch_data)} 条数据")
    
    cursor.close()
    conn.close()
    

方法二:用MySQL原生LOAD DATA INFILE(高效,适合大文件)

如果你的CSV文件体积很大,用MySQL原生工具导入速度更快,需要先预处理文件名解析,生成对应的导入脚本:

  1. 编写批量导入脚本(以Bash为例,适用于Linux环境)
    遍历所有CSV文件,为每个文件生成LOAD DATA语句,把文件名解析出的字段作为固定值插入:

    #!/bin/bash
    CSV_DIR="/path/to/your/csv/files"
    DB_USER="数据库用户名"
    DB_PASS="数据库密码"
    DB_NAME="目标数据库名"
    
    for file in $CSV_DIR/*.csv; do
        filename=$(basename "$file")
        base_name=${filename%.csv}
        # 解析文件名中的标识字段
        test_id=${base_name:0:4}
        user_id=${base_name:4:4}
        channel_id=${base_name:8:4}
        # 执行MySQL导入命令
        mysql -u$DB_USER -p$DB_PASS $DB_NAME << EOF
        LOAD DATA INFILE '$file'
        INTO TABLE test_results
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
        IGNORE 1 ROWS
        (result1, result2, result3)
        SET test_id='$test_id', user_id='$user_id', channel_id='$channel_id';
        EOF
        echo "完成导入: $filename"
    done
    

    注意:使用LOAD DATA INFILE需要确保MySQL服务有权限读取目标CSV文件,并且secure_file_priv配置符合要求。

  2. 执行脚本
    给脚本添加执行权限:chmod +x import_csv.sh,然后运行./import_csv.sh即可批量完成导入。


关键注意事项

  • 字段格式匹配:如果数据库字段只需要数字部分(比如T001只存001),可以在解析文件名时处理,比如test_id = base_name[1:4]
  • CSV格式一致性:所有CSV文件的列数、顺序必须和数据库表中要插入的结果字段完全对应,避免插入报错。
  • 事务保障:如果用脚本插入,建议添加事务处理逻辑,避免部分文件导入失败导致数据不一致。

内容的提问来源于stack exchange,提问作者R Loomas

火山引擎 最新活动