如何直接将.snp文件导入MySQL数据库?无需先转CSV格式
直接将.snp文件导入MySQL的PHP实现方案
方案1:利用MySQL LOAD DATA INFILE 直接读取.snp文件
这是效率最高的方法,跳过中间转换步骤,让MySQL直接解析.snp文件。需要先明确你的.snp文件字段分隔规则(通常是制表符或空格)。
<?php // 初始化PDO连接 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 编写LOAD DATA语句,根据.snp实际格式调整参数 $importSql = " LOAD DATA INFILE '/服务器上的.snp文件绝对路径' INTO TABLE 目标表名 FIELDS TERMINATED BY '\t' -- 如果是空格分隔,改为' ';固定宽度则不需要此参数 OPTIONALLY ENCLOSED BY '\"' -- 如果字段带引号,保留此句 LINES TERMINATED BY '\n' IGNORE 1 LINES; -- 若文件首行是表头,添加此句跳过 "; try { $pdo->exec($importSql); echo "导入成功"; } catch(PDOException $e) { echo "导入失败: " . $e->getMessage(); } ?>
注意点:
- 确保MySQL进程有权限读取.snp文件,或使用
LOAD DATA LOCAL INFILE(需在PHP和MySQL配置中开启local_infile参数)。 - 如果.snp是固定宽度格式,需替换字段规则为
COLUMNS TERMINATED BY '',并通过SET子句指定每个字段的截取位置,例如:SET col1 = SUBSTRING(@row,1,10), col2 = SUBSTRING(@row,11,20)
方案2:逐行读取.snp并批量插入
如果无法使用LOAD DATA(比如权限限制),可以手动读取文件内容,分割字段后批量插入数据库。
<?php // 初始化mysqli连接 $mysqli = new mysqli('localhost', '用户名', '密码', '你的数据库名'); if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error); } $fileHandle = fopen('/你的.snp文件路径', 'r'); // 跳过表头(如果有) fgets($fileHandle); $batchSize = 1000; // 每1000条数据批量插入一次 $values = []; while (($line = fgets($fileHandle)) !== false) { $line = trim($line); if (empty($line)) continue; // 根据.snp分隔规则分割字段,这里以任意空格分隔为例 $fields = preg_split('/\s+/', $line); // 转义特殊字符避免SQL注入 $escapedFields = array_map(function($field) use ($mysqli) { return $mysqli->real_escape_string($field); }, $fields); $values[] = "('" . implode("', '", $escapedFields) . "')"; // 达到批量阈值时执行插入 if (count($values) >= $batchSize) { $sql = "INSERT INTO 目标表名 (列1, 列2, 列3) VALUES " . implode(', ', $values); $mysqli->query($sql); $values = []; } } // 插入剩余的未批量数据 if (!empty($values)) { $sql = "INSERT INTO 目标表名 (列1, 列2, 列3) VALUES " . implode(', ', $values); $mysqli->query($sql); } fclose($fileHandle); $mysqli->close(); echo "导入完成"; ?>
注意点:
- 如果是固定宽度的.snp文件,需用
substr()代替preg_split()来截取每个字段,例如$col1 = substr($line, 0, 8)。 - 批量插入大小可根据服务器性能调整,避免单次插入数据量过大导致超时。
核心前置检查
- 先确认.snp文件的字段格式:分隔符类型、是否有表头、是否存在特殊字符(如换行、引号)。
- 确保目标MySQL表的列数、数据类型与.snp文件字段完全匹配,避免插入失败。
内容的提问来源于stack exchange,提问作者Mie Kriting
相关产品推荐
相关产品推荐

