根据提交的二维数据得到mysql建表和插入数据实用工具

根据提交的二维数据得到mysql建表和插入数据实用工具,这是重构版本(之前有过)。

会通过数据的长度,类型,是否数字,是否唯一等做判断,且每千条一个插入语句以优化性能。

<?php 
//整理与分享:yujianyue<15058593138@qq.com>
setlocale(LC_ALL, 'C'); //window:删除行首双斜杠
$ti = "csv2sql";
$filename = 'data.csv'; // CSV 文件路径function analyzeCSV($filename) {
if (!file_exists($filename) || !is_readable($filename)) {
die("CSV file not found or not readable.");
}
$handle = fopen($filename, 'r');
$header = fgetcsv($handle,0,"\t"); // 获取表头
$data = []; $Info = []; // 用于存储字段分析结果
while (($row = fgetcsv($handle,0,"\t")) !== false) {
$data[] = $row; $ii=0;
foreach ($row as $index => $value) {
$fName = $header[$index];
$length = strlen($value);  $ii++;
if (!isset($Info[$fName])) {
$Info[$fName] = [
'maxLen' => 8,
'mixLen' => 2,
'iseng' => false,
'isNum' => true,
'keNull' => false,
'values' => [],
'isFix' => true
];
}
// 更新字段长度信息
$Info[$fName]['maxLen'] = max($Info[$fName]['maxLen'], $length);
$Info[$fName]['mixLen'] = max($Info[$fName]['mixLen'], $length);
// 检查是否为数字
if (!is_numeric($value) ) $Info[$fName]['isNum'] = false;
// 检查是否为6+英文数字(username)
if (preg_match('/^[a-zA-Z0-9]{6,18}$/', $value)) $Info[$fName]['iseng'] = true;
// 检查是否有空值
if ($value === '') { $Info[$fName]['keNull'] = true; }
// 检查是否等长
if ($Info[$fName]['isFix'] && $length !== $Info[$fName]['maxLen'] && $value !== '') {
$Info[$fName]['isFix'] = false;
}
$Info[$fName]['values'][] = $value;
}
}
fclose($handle);
foreach ($Info as $fName => &$info) {
$info['isUni'] = count(array_unique($info['values'])) === count($info['values']);
}
$tableName = basename($filename, ".csv");
$cTab = "CREATE TABLE `$tableName` (\n";
$cTab .= "`chalide_id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n";
$oSQL = "\n\n-- -可能需要修改:表名称等\n\n";
$oSQL .= "INSERT INTO `$tableName` (" . implode(", ", array_map(function($field) { return "`$field`"; }, $header)) . ") VALUES\n";
$iSuo = [];
foreach ($Info as $fName => $info) {
// 确定字段类型
if ($info['isNum']) {
$type = "INT(" . $info['maxLen'] . ")"; // $type = "FLOAT";
} else {
$type = "VARCHAR(" . $info['maxLen'] . ")";
}
// 添加 NULL 或 NOT NULL
$nullability = $info['keNull'] ? "" : "NOT NULL";
// 添加唯一性约束
$unique = "";
if($info['iseng']){
$unique = $info['isUni'] ? "UNIQUE" : "";
$iSuo[] = " INDEX ".$fName." (`".$fName."`)";
}
$cTab .= " `$fName` $type $nullability $unique COMMENT '$fName',\n";
}
if(count($iSuo)>0){
$cTab .= join(",\n", $iSuo) . "\n);\n";
}else{
$cTab = rtrim($cTab, ",\n"). "\n);\n";
}
$cTab .= "\n-- -以下可删除:供优化修改参考\n";
$cTab .= "-- -可能需要修改表名;字段长度;默认值等 及 以下索引优化\n";
$cTab .= "-- -字段名称别符号,可英文字母开头字母数字可中文\n";
$cTab .= "-- -普通索引参考: INDEX ".$fName." (`".$fName."`),\n";
$cTab .= "-- -全文索引参考: FULLTEXT (`".$fName."`),\n";
$cTab .= "-- -唯一索引参考: UNIQUE KEY `".$fName."` (`".$fName."`),\n";
$cTab .= "-- -索引参考: KEY `".$fName."` (`".$fName."`),\n";
// 生成插入数据的 SQL 语句
$values = []; $ii=0; $iSQL="";
foreach ($data as $row) {
$ii++;
$rowValues = array_map(function($value) {
return $value === '' ? "NULL" : "'" . addslashes($value) . "'";
}, $row);
$values[] = "(" . implode(", ", $rowValues) . ")";
if(stristr("$ii|","000|")){$iSQL .= $oSQL . implode(",\n", $values) . ";\n"; $values = [];
}
}
if(count($values)>0)$iSQL .= $oSQL . implode(",\n", $values) . ";\n";return [
'cTab' => $cTab,
'iSQL' => $iSQL
];
}
function txtarea($nb,$ti="结果展示",$ht="88vh") {$nb = htmlspecialchars($nb);$ti = "<p>$ti</p>";return "<div class='ban'>$ti<textarea style='height:$ht;'>$nb</textarea></div>";
}
if($_GET["x"] == "cha"){
$txts = isset($_POST['tips']) ? Trim($_POST['tips']) : '';
file_put_contents($filename,$txts);
$result = analyzeCSV($filename);
echo txtarea($result['cTab'],"CREATE TABLE SQL:");
echo txtarea($result['iSQL'],"INSERT SQL:");
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $ti;?></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes" />
<script type="text/javascript">
console.log("问题反馈电话:","15058593138");
console.log("问题反馈邮件:","admin@12391.net");
function $(objId){
return document.getElementById(objId);
}
function loadcha(xid) {
var xmlhttp;
var Stxt= "nums=aa";
Stxt+="&tips="+ encodeURIComponent($("tips").value);
//$("tips").innerHTML = "正在加载...";
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var btxt = xmlhttp.response;
if(btxt == "err01"){ $("tipx").innerHTML = "!"; return false;}
$('tipx').innerHTML = xmlhttp.response;
}
}
xmlhttp.open("POST", "?x=cha&tt="+Math.random(), true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(Stxt);
}</script>
<style>
#tipx{display:flex;width:99.7%;border:0;margin-top:5px;}
.ban{width:49%;border:0;margin:0;}
textarea{display:block;width:99.7%;min-width:360px;border:1px solid #ccc;height:160px;}
table{margin:10px auto;border-left:1px solid #a2c6d3;border-top:3px solid #0180CF;width:99.7%;}
table td{border-right:1px solid #a2c6d3;border-bottom:1px solid #a2c6d3;word-wrap:break-word;word-break:break-all;}
.tt{background-color: #f2f2f2;}
b{color:red;}
#submit{ height:35px;}
</style>
</head>
<body><form class="form" id="form" method="POST" act="?act=cha" ><h3><?php echo $ti;?></h3>
<textarea id="tips">
姓名	学号	身份证号	科目1	科目2	科目3	科目4	科目5	科目.	科目N
李一	10001001	90001001	87	84	75	91	83	76	87
李二	10001002	90001002	95	81	81	71	60	82	99
李三	10001003	90001003	68	80	65	79	68	71	91
李四	10001004	90001004	82	80	75	90	87	64	81
李五	10001005	90001005	60	64	61	71	73	85	61
李六	10001006	90001006	62	69	77	73	96	67	82
李七	10001007	90001007	98	72	68	59	84	92	92
李一	10001001	90001001	87	84	75	91	83	76	87
李二	10001002	90001002	95	81	81	71	60	82	99
李三	10001003	90001003	68	80	65	79	68	71	91
李四	10001004	90001004	82	80	75	90	87	64	81
李五	10001005	90001005	60	64	61	71	73	85	61
李六	10001006	90001006	62	69	77	73	96	67	82
李七	10001007	90001007	98	72	68	59	84	92	92
李一	10001001	90001001	87	84	75	91	83	76	87
李二	10001002	90001002	95	81	81	71	60	82	99
李三	10001003	90001003	68	80	65	79	68	71	91
李四	10001004	90001004	82	80	75	90	87	64	81
李五	10001005	90001005	60	64	61	71	73	85	61
李六	10001006	90001006	62	69	77	73	96	67	82</textarea>
<input type="button" id="submit" value="提交" onclick="loadcha('xid')">
<div id="tipx"></div></form>
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/397.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库连接池实现

目录 前提&#xff1a;如果我要操作多个表&#xff0c;那么就会产生冗余的JDBC步骤&#xff0c;另一个弊端就是每次都需要数据库连接对象&#xff08;Connection&#xff09;&#xff0c;获取效率低下&#xff0c;每次使用时都需要先进行连接 数据库连接池的特点&#xff1a; …

JavaEE初阶------网络编程续+传输层UDP协议介绍

文章目录 1.实现翻译服务器2.TCP的socket api使用3.初识网络编程3.1开发中常见的格式3.1.1行文本方式构造3.1.2xml格式表示3.1.3json处理格式3.1.4protobuffer格式 3.2传输层3.2.1UDP报文格式3.2.2校验和的说明3.2.3校验和的计算方法3.2.3.1CRC算法3.2.3.2MD5算法 1.实现翻译服…

python的数据结构列表方法及扩展(栈和队列)

python的数据结构 python的list方法 list.append() 添加一个元素到列表末尾。list,append(num)相当于a[len(a):] [num] a [1,2,3,4,5] a.append(6) print(a) a[len(a):] [7] print(a)list.extend() 添加指定列表的所有元素。list.extend(nums)相当于a a nums a [1,2,3]…

我与Linux的爱恋:基础IO 文件描述符重定向缓冲区

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 文件描述符文件描述符分配规则访问文件的本质 重定向原理缓冲区的理解 文件描述符 通过上述内容&#xff0c;我们知道使用 open 系统调用打开文件时&#xff0c;系…

Java每日刷题之二分算法

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 转化 通过题目时间复杂度为O(logN),我们就可以联想到二分算法&#xff0c;但是我们前面学到的算法&#xff0c;是查找出&#xff0c;有序数组里的值&#xff0c;并不是求其中的范围&a…

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类&#xff0c;它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状&#xff0c;也可以用于绘制背景等。通过QBrush&#xff0c;可以设置填充的颜色、样式&#xff08;如实心、渐变、纹理等&#xff09…

postman如何安装旧版本不升级(以9.31和11.10版本为例)

postman版本超过10.x&#xff08;包含10.x)&#xff0c;有个大的麻烦&#xff0c;就是需要登录账号&#xff0c;如果网络不佳&#xff08;其实是外网受限&#xff09;,那就很难受了 功能页面都进不去了&#xff01;而8.x /9.x等以下版本就不需要登录了。 比如9.31.30这个版本就…

线程函数和线程启动的几种不同形式

线程函数和线程启动的几种不同形式 在C中&#xff0c;线程函数和线程启动可以通过多种形式实现。以下是几种常见的形式&#xff0c;并附有相应的示例代码。 1. 使用函数指针启动线程 最基本的方式是使用函数指针来启动线程。 示例代码&#xff1a; #include <iostream&g…

Arm和高通闹翻在即,或影响骁龙 8 Elite

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; Arm向高通下达最后通牒&#xff0c;骁龙 8 Elite或受影响 其实对于小江这个不咋关注安卓圈的用户来说&#xff0c;高通和Arm大概就是秤不离砣&#xff0c;砣不离秤的关系。不过在看了今天的最新…

【学术精选】SCI期刊《Electronics》特刊“New Challenges in Remote Sensing Image Processing“

英文名称&#xff1a;New Challenges in Remote Sensing Image Processing 中文名称&#xff1a;"遥感图像处理的新挑战"特刊 期刊介绍 “New Challenges in Remote Sensing Image Processing”特刊隶属于《Electronics》期刊&#xff0c;聚焦遥感图像处理领域快速…

人机环境系统智能是东方天地人思想与西方科技思维的融合

西方科技思维常常受到还原主义的影响&#xff0c;这种思维方式通常强调将复杂系统拆解为更简单的部分进行分析&#xff08;比如物理的分子、原子、电子、夸克……&#xff0c;数理中的分解因式&#xff09;。以下是还原主义的一些特点&#xff1a; 分析方法&#xff1a;强调通过…

深度学习:梯度下降算法简介

梯度下降算法简介 梯度下降算法 我们思考这样一个问题&#xff0c;现在需要用一条直线来回归拟合这三个点&#xff0c;直线的方程是 y w ^ x b y \hat{w}x b yw^xb&#xff0c;我们假设斜率 w ^ \hat{w} w^是已知的&#xff0c;现在想要找到一个最好的截距 b b b。 一条…

瑞芯微RK3566/RK3568 Android11下该如何默认屏蔽导航栏/状态栏?看这篇文章就懂了

本文介绍瑞芯微RK3566/RK3568在Android11系统下&#xff0c;默认屏蔽导航栏/状态栏方法&#xff0c;使用触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;Laval官方社区主荐&#xff0c;已适配全新OpenHarmony5.0 R…

Python | Leetcode Python题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, m: int, n: int):self.m mself.n nself.total m * nself.map {}def flip(self) -> List[int]:x random.randint(0, self.total - 1)self.total - 1# 查找位置 x 对应的映射idx self.map.get(x,…

从0学习React(6)

这两天在写IT资产管理的时候&#xff0c;对于前端&#xff0c;我一直没有任何头绪&#xff0c;不知道怎么写。因为我之前并没有学习过前端方面的知识&#xff0c;我学的都是后端。我在写后端接口的时候&#xff0c;我是自己有一些基础的&#xff0c;然后我又参照着模仿着一些很…

单个相机矫正畸变

1、通过标定助手获取到内参外参&#xff0c;外参在此无效&#xff0c;只用到了内参 2、然后通过halcon算子进行矫正 参考&#xff1a;超人视觉

乘云而上,OceanBase再越山峰

一座山峰都是一个挑战&#xff0c;每一次攀登都是一次超越。 商业数据库时代&#xff0c;面对国外数据库巨头这座大山&#xff0c;实现市场突破一直都是中国数据库产业多年夙愿&#xff0c;而OceanBase在金融核心系统等领域的攻坚克难&#xff0c;为产业突破交出一副令人信服的…

laravel: Breeze 和 Blade, 登录 注册等

composer require laravel/breeze --dev php artisan breeze:install php artisan migrate npm install npm run build php artisan route:clear http://laravel-dev.cn/ http://laravel-dev.cn/register http://laravel-dev.cn/login

VS+Qt解决提升控件后,包含头文件格式不对问题处理

一、前言 VSQt 提升控件后&#xff0c;在uic目录下会生成ui相关的初始化文件&#xff0c;对于提升的控件头文件包含的格式为#include<> 而非 #include “ ” 导致无法找到头文件。如果手动修改为 #include “ ”相当麻烦&#xff0c;甚至每次编译都要修改一遍&#xff0c…

一些硬件知识【2024/11/3】

MLCC电容的ESR比较小&#xff0c;但是他的缺点是容量通常比较低&#xff1b;电解电容的容量比较大&#xff0c;但是他的ESR比较大&#xff1b;而钽电容介于两者之间&#xff0c;是MLCC找不到合适的容值比较大的时候&#xff0c;找钽电容&#xff1a; LC谐振电路&#xff1a; 五…