shell 批量导表到数据库

news2024/12/28 16:50:05

需求 :

1, 一堆表格,csv 文件,

2,特定分割符,

3,表头有特殊utf 16进制字符,文件可能是16进制或者utf8的格式,统一utf8

4,读取第一行作为表头处理一些空的字符,还有特殊字符,BOM (Byte Order Mark)

5,转化linux路径为MYSQL可识别路径,先转换下中文到英文,否则mysql不能load

6,循环导入到数据库中。

可以每个表在数据库工具中,像Navicat里导入,1 by 1,也可以用shell 实现批量处理,遍历文件夹下面的所有csv文件,子目录,再下级子目录中的文件。

实现方法

#!/bin/bash
#先来个修改文件名,中文->英文 新文件放开修改
sh rename_ch2en.sh 
MYSQL_DB='impcsv'
MYSQL_USER='username'
MYSQL_PASSWORD='pwd'
MYSQL_HOST="localhost"
TABLE='your_table_name'
ROOT_DIR="/d/urfolder/datafile"
utf8_suffix='_utf8.csv'  #设置一个后缀好转化文件给个标记
#for FILE in "${CSV_FILES[@]}"; do
#  echo "Importing $FILE into $DATABASE:$TABLE"
#  mysql -u "$USER" -p"$PASS" "$DATABASE" -e "LOAD DATA LOCAL INFILE '$FILE' INTO TABLE $TABLE FIELDS TERMINATED BY ';' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
#done
# 遍历目录及子目录中的CSV文件,先遍历清除uft8的文件,不清楚会连续转码,出现乱码情况
#cd ROOT_DIR
echo $6
find . -type f -name '*utf8*' -exec rm -f {} +
find "$ROOT_DIR" -type f -name "*.csv" | while read -r csv_file; do
    # 获取文件相对路径和目录名称,确保处理空格和特殊字符,直接替换root dir为空 D:/urfolder/datafile/test/firstfolder/test1.csv
    relative_dir=$(dirname "$csv_file" | sed "s|$ROOT_DIR/||;s/\s+/_/g") #test/firstfolder
	# 获取子文件夹名称和CSV文件名称
    folder_name=$(basename "$relative_dir") # 最后一级目录名 firstfolder
	echo "folder_name = $folder_name" 
    file_name_org=$(basename "$csv_file" .csv)
	#连续空格替换为下划线
	file_name=$(echo "$file_name_org" | sed -E "s/\s+/_/g")
	echo "file_name = $file_name"   #file_name = test1
    #连续空格替换为下划线
	rel_dir_sed=$(echo "$relative_dir" | sed -E "s/\//_/g;s/#//g;s/\s\+/_/g")
	table_name="${rel_dir_sed}_${file_name}"
	echo "table_name = $table_name" #table_name = firstfolder_test1
	conv_file="$file_name"$utf8_suffix
	echo "utf8 file = $conv_file"
	# 切换到目标目录
    target_dir="$ROOT_DIR/$relative_dir"
	# 使用 cygpath 转换为 Windows 风格路径,mysql 不能识别
	#wnds_tgt_dir=$(cygpath -w "$target_dir")
	wnds_tgt_dir=$(echo "$target_dir" | sed 's|/d/|D:/|')
    if [[ $(pwd) != "$target_dir" ]]; then
        echo "working on folder $relative_dir, but now we are in $(pwd), let's jump to folder $relative_dir"
        cd "$target_dir" || { echo "无法进入目标文件夹: $target_dir"; continue; }
    fi

    echo "current folder: $(pwd)"
	# 检测文件编码
	file_encoding=$(file -bi "$csv_file" | awk -F'=' '{print $2}')

	# 根据文件编码判断是否需要转换
	if [[ "$file_encoding" == "utf-8" ]]; then
		echo "文件编码是 UTF-8,不需要转换"
		cp "$csv_file" "./$conv_file"
	elif [[ "$file_encoding" == "utf-16le" ]]; then
		echo "文件编码是 UTF-16LE,正在转换为 UTF-8..."
		iconv -f UTF-16LE -t UTF-8 "$csv_file" > "./$conv_file"
		echo "转换完成,保存为 ./$conv_file"
	else
		echo "文件编码未知:$file_encoding,无法处理"
		exit 1
	fi
	echo "starting convert encoding character from utf16 to utf8...."
	#iconv -f UTF-16LE -t UTF-8 $csv_file > ./$conv_file
	##chmod 777 ./$conv_file.csv
    # 创建表结构:根据CSV文件的列名创建表
    # 首先获取CSV文件的列名
	#echo "$(ls -l)"
	echo "......start getting the column name from $conv_file file......"
	#echo "$(head -n 1 "./$conv_file" | sed -E "s/ +/_/g;  s/#//g; s/\"//g")"
    columns=$(head -n 1 "./$conv_file" | sed -E "s/ +/_/g; s/#//g; s/\"//g")
	# 初始化最终结果变量
	final_columns=""

	# 将列字符串按逗号分割,并逐一处理每个字段
	IFS=';' read -ra fields <<< "$columns"  # 使用 IFS 读取为数组
	for field in "${fields[@]}"; do
		#field=$(echo "$field" | xargs)  # 去掉前后空格
		#printf 'Field: "%s"\n' "$field"  # 打印原始字段 00000000: efbb bf54 494d 450a                      ...TIME. 
		#echo "$field" | xxd  # 打印字段的 HEX 编码 包含 BOM (Byte Order Mark),这是导致匹配失败的原因。BOM 是一种 UTF-8 文件的字节标记,通常出现在文件开头,导致在字段前意外插入不可见字符 \xEF\xBB\xBF
		# 去掉前后空格、移除 BOM 和其他特殊字符
		field=$(echo "$field" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | tr -d '\r' | sed 's/^\xEF\xBB\xBF//')
		if [[ -z "$field" ]]; then
			continue  # 如果是空行,跳过
		fi

		if [[ "$field" == "TIME" ]]; then
			final_columns+="$field varchar(255), "
		else
			final_columns+="$field float, "
		fi
		#echo $field
	done

	# 去掉最终结果末尾多余的逗号和空格
	final_columns="${final_columns%, }"
    # 去掉列名末尾的逗号,末位字段没有类型,添加float
    #columns="${columns%,} float"
	
	#echo "columns now we get as below : $final_columns"
    # 创建SQL语句来创建表
	echo "start creating table...."
	drop_table_sql="drop TABLE IF EXISTS \`$table_name\`; "
    create_table_sql="CREATE TABLE \`$table_name\` ($final_columns);"
	echo "$create_table_sql"
	#打开导入文件环境变量
	upd_var_sql="set global local_infile='ON';" 
	
	 # 导入CSV数据到数据库表
    load_data_sql="LOAD DATA LOCAL INFILE '$wnds_tgt_dir/$conv_file' INTO TABLE \`$table_name\` FIELDS TERMINATED BY ';' ENCLOSED BY '\n' LINES TERMINATED BY '\n' IGNORE 1 ROWS;"
	echo "load_data_sql \\n $load_data_sql"
	exec_sql="$drop_table_sql $create_table_sql $upd_var_sql $load_data_sql"
    # 执行创建表的SQL语句
    echo "$exec_sql" | mysql --local-infile=1 -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -h "$MYSQL_HOST" "$MYSQL_DB"
 
    echo "Data from $csv_file has been successfully imported into table \`$table_name\`"
done 
echo "Import completed."

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

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

相关文章

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下&#xff0c;“替代进口”成为许多企业级应用所需要面对的重要课题&#xff0c;搜索领域也不例外。 Elasticsearch&#xff08;简称 ES&#xff09;作为一款业界领先的全文搜索和分析引擎&#xff0c;虽然功能强大&#xff0c;但…

Ubuntu 24.04.1 LTS 配置静态固定IP地址

查看网络配置信息 ip addr使用该命令查看网卡名字&#xff0c;一般是ens33或者ens32 修改配置文件 打开 /etc/netplan/下面的yaml配置文件 根据自己的需要配置 network:ethernets:ens33: # 配置的网卡的名称addresses: [192.168.23.140/24] # 配置的静态ip地址和掩码d…

Deep Deterministic Policy Gradient (DDPG)算法

代码 import torch import torch.nn as nn import torch.optim as optim import numpy as np import gym import random from collections import deque# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self).…

C++ OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总 1.JVM内存中的对象何时会被垃圾回收 (1)什么…

基于SpringBoot在线音乐系统平台功能实现十八

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的迅猛发展和普及&#xff0c;人们对音乐的获取和欣赏方式发生了巨大改变。传统的音乐播放方式&#xff0c;如CD、磁带或本地下载的音乐文件&#xff0c;已经不能满足用户日益增长的需求。用户更希望通过网络直接获取各…

RouYi-Vue框架,环境搭建以及使用

使用若以框架需要配置node.js&#xff0c;如果不了解可以去看node.js安装&#xff0c;uni-app的配置使用_uniapp使用nodejs类库-CSDN博客 安装若依 首先是去若以官网下载自己所需要的框架类型 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff…

XL系列433芯片、2.4G收发芯片 通讯对码说明

XL系列433芯片对码说明&#xff1a; 发射芯片 XL4456 通过数据脚接收高低电平然后经过调制将波形发出&#xff0c;而接收芯片 XL520 通过接收波形后进行解调&#xff0c;数据脚输出高低电平。至于具体的通信协议&#xff0c;需要用户自定义&#xff0c;一般而言&#xff0c;使…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

期权懂|如何计算期权卖方平仓后的盈利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何计算期权卖方平仓后的盈利&#xff1f; 期权卖方平仓后的盈利计算涉及多个因素&#xff0c;包括期权的交易价格、平仓价格以及权利金的变动等。 交易价格&#xff1a;期权卖…

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果&#xff1a; 缺陷&#xff1a; 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…

uniapp中wx.getFuzzyLocation报错如何解决

一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下&#xff1a; uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; r…

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后&#xff0c;在Ubuntu系统上装载 D盘&#xff0c;发现无法装载错误如下&#xff1a; Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…

硬件设计-高速电路的过孔

目录 摘要 &#xff1a; 过孔的机械特性&#xff1a; 过孔直径&#xff1a; 过孔焊盘尺寸 摘要 &#xff1a; 过孔这个词指得是印刷电路板&#xff08; PCB &#xff09;上的孔。过孔可以用做焊接插装器件的焊&#xff08; Through hole) &#xff0c;也可用做连接层间走…

mysql索引的理解

1、索引是什么&#xff1f; 索引&#xff1a;简单理解就是我们字典的目录&#xff0c;一个索引可以找得到多个记录。 作用加快我们数据库的查询速度。索引本身较大&#xff0c;往往存储在磁盘的文件里。可能存储在单独的索引文件中&#xff0c;也可能和数据一起存储在数据文件…

【WRF模拟】如何得到更佳的WRF模拟效果?

【WRF模拟】如何得到更佳的WRF模拟效果&#xff1f; 模型配置&#xff08;The Model Configuration&#xff09;1.1 模拟区域domain设置1.2 分辨率Resolution (horizontal and vertical)案例&#xff1a;The Derecho of 29-30 June 2012 1.3 初始化和spin-up预热过程案例1-有无…

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

单片机+人体红外感应的防盗系统设计(仿真+源码+PCB文件+报告)

资料下载地址&#xff1a;单片机人体红外感应的防盗系统设计(仿真源码PCB文件报告) 1、功能介绍 (1)该设计包括硬件和软件设计两个部分。 (2)本红外线防盗报警系统由热释电红外传感器、报警器、单片机控制电路、LED控制电路及相关的控制管理软件组成。用户终端完成信息采集、处…