使用bash将csv文件数据读写到MySQL数据库的脚本之一




情景:
有一个包含多个系的学生详细信息的csv文件,需要将文件的内容插入到一个数据表中,保证每一个系生成一个单独的排名列表。

学习信息表 studentdata.csv 文件的数据如下:

1,Navin M,98,CS
2,Kavya N,70,CS
3,Nawaz O,80,CS
4,Hari S,80,EC
5,Alex M,50,EC
6,Neenu J,70,EC
7,Bob A,30,EC
8,Anu M,90,AE
9,Sruthi,89,AE
10,Andrew,89,AE



脚本思路
这个问题有两种处理思路,从shell脚本的角度看,可以用sort,awk等bash工具解决,也可以用一个sql数据库的数据表也可以解决。
下面需要编写3个脚本,分别用于创建数据库及数据表、想数据表中插入学生数据、从数据表中读取并显示处理过的数据。

注意:下面脚本中mysql数据连接的user,pass,socket等变量是我测试环境中的连接,在使用脚本时可以根据情况修改;
另外对于实际导入的csv格式和行数不同,可以对照进行脚本中的数据库名、表名、列名进行修改,这样这三个脚本就可以解决这一类问题了。


脚本一、创建数据库及数据表的脚本如下:

#!/bin/bash
#filename : create_db.sh
#use : create mysql database and tables

USER="root"
PASS="123456"
SOCKET="/data/mysqldata/3306/mysql.sock"

mysql -u $USER -p$PASS -S $SOCKET <<EOF 2> /dev/null
create database students;
EOF

[ $? -eq 0 ] && echo Created DB || echo DB already exist
mysql -u $USER -p$PASS -S $SOCKET students <<EOF 2> /dev/null
create table students(
id int,
name varchar(100),
mark int,
dept varchar(4)
);
EOF

[ $? -eq 0 ]  && echo Created table students || echo Table students already exist

mysql -u $USER -p$PASS -S $SOCKET students <<EOF
delete from students;
EOF


脚本二、将数据插入数据表的脚本如下:

#!/bin/bash
#filename : write_to_db.sh
#use : read data from csv files and insert into mysql db

USER="root"
PASS="123456"
SOCKET="/data/mysqldata/3306/mysql.sock"

if [ $# -ne 1 ];
then
    echo $0 DATAFILE
    echo
    exit 2
fi
data=$1

while read line;
do
    oldIFS=$IFS
    IFS=,
    values=($line)
    values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
    values[3]="\"`echo ${values[3]}`\""

    query=`echo ${values[@]} | tr ' #' ', ' `
    IFS=$oldIFS
                                            
    mysql -u $USER -p$PASS -S $SOCKET students <<EOF
insert into students values($query);
EOF

done< $data
echo Wrote data into DB



脚本三、查询数据库的脚本如下:

#!/bin/bash
#filename: read_db.sh
#use : read data from mysql db

USER="root"
PASS="123456"
SOCKET="/data/mysqldata/3306/mysql.sock"

depts=`mysql -u $USER -p$PASS -S $SOCKET students <<EOF | tail -n +2
select distinct dept from students;
EOF`

for d in $depts;
do

echo Department : $d
result="`mysql -u $USER -p$PASS -S $SOCKET students <<EOF
SET @i:=0;
select @i:=@i+1 as rank,name,mark from students where dept="$d" order by mark desc;
EOF`"

echo "$result"
echo 

done



脚本按照顺序执行结果如下:

# chmod +x create_db.sh write_to_db.sh read_db.sh
# ./create_db.sh                                             
DB already exist
Table students already exist
# 
# ./write_to_db.sh studentdata.csv       
Wrote data into DB
# 
# ./read_db.sh                         
Department : CS
rank    name    mark
1       Navin M 98
2       Nawaz O 80
3       Kavya N 70

Department : EC
rank    name    mark
1       Hari S  80
2       Neenu J 70
3       Alex M  50
4       Bob A   30

Department : AE
rank    name    mark
1       Anu M   90
2       Sruthi  89
3       Andrew  89


在MySQL数据库中确认插入后结果:

mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| students           |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> 
mysql> use students;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| students           |
+--------------------+
1 row in set (0.00 sec)

mysql> 
mysql> select * from students;
+------+---------+------+------+
| id   | name    | mark | dept |
+------+---------+------+------+
|    1 | Navin M |   98 | CS   |
|    2 | Kavya N |   70 | CS   |
|    3 | Nawaz O |   80 | CS   |
|    4 | Hari S  |   80 | EC   |
|    5 | Alex M  |   50 | EC   |
|    6 | Neenu J |   70 | EC   |
|    7 | Bob A   |   30 | EC   |
|    8 | Anu M   |   90 | AE   |
|    9 | Sruthi  |   89 | AE   |
|   10 | Andrew  |   89 | AE   |
+------+---------+------+------+
10 rows in set (0.00 sec)

mysql> 





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用psql命令,将csv文件导入到PostgreSQL数据库,可以使用以下命令:\copy tablename from 'path/to/file.csv' delimiter ',' csv header; 例如:\copy users from '/tmp/users.csv' delimiter ',' csv header; 如果要将脚本自动化,可以使用shell脚本:#!/bin/bash psql -f /path/to/sql/script.sql ### 回答2: 要将CSV文件导入到PostgreSQL数据库,可以编写一个Linux脚本来实现。 首先,需要在Linux系统上安装PostgreSQL数据库,并确保已经创建好目标数据库。 然后,创建一个新的文本文件,可以使用vi或者其他文本编辑器,输入以下内容: ``` #!/bin/bash # 设置数据库信息 DB_HOST="localhost" DB_PORT="5432" DB_NAME="your_database_name" DB_USER="your_username" DB_PASSWORD="your_password" # 设置CSV文件路径 CSV_FILE="path/to/your/csv/file.csv" # 使用psql命令导入CSV文件数据库 psql -h $DB_HOST -p $DB_PORT -d $DB_NAME -U $DB_USER -c "\COPY your_table_name FROM '$CSV_FILE' DELIMITER ',' CSV HEADER;" ``` 将上述脚本保存为一个.sh文件,例如import_csv.sh。 接下来,进入命令行界面,导航到包含脚本文件的目录。运行以下命令将脚本文件设置为可执行: ``` chmod +x import_csv.sh ``` 然后,可以运行脚本文件来导入CSV文件到PostgreSQL数据库: ``` ./import_csv.sh ``` 脚本将会连接到指定的数据库,并将CSV文件导入到该数据库中的指定表格中。 需要确保替换脚本中的相关信息,例如数据库名称、用户名、密码、CSV文件路径和目标表格名称。此外,还可以根据需要进一步定制脚本。 希望以上回答对您有帮助! ### 回答3: 要将csv文件导入到postgresql数据库的linux脚本,你可以使用以下步骤: 1. 首先,确认你已经安装了postgresql数据库和相关的命令行工具。如果没有,请先安装它们。 2. 创建一个新的数据库表,用来存储csv文件数据。你可以使用以下命令在postgresql数据库中创建表: ``` CREATE TABLE table_name ( column1 datatype1, column2 datatype2, ... ); ``` 将table_name替换为你想要创建的表的名称,并为每列指定合适的数据类型。 3. 编写一个shell脚本来导入csv文件数据库。创建一个新的文件,比如import.sh,并添加以下内容: ``` #!/bin/bash psql -d database_name -c "\copy table_name FROM '/path/to/csv/file.csv' DELIMITER ',' CSV HEADER" ``` 将database_name替换为你要导入数据数据库的名称,将table_name替换为你在第2步中创建的表的名称,将/path/to/csv/file.csv替换为你要导入的csv文件的路径。 4. 保存并关闭脚本文件。 5. 授予脚本文件执行权限。使用以下命令: ``` chmod +x import.sh ``` 6. 运行脚本文件使用以下命令: ``` ./import.sh ``` 这将运行脚本并将csv文件数据导入到postgresql数据库的表中。 请注意,以上步骤假设你已经正确安装了postgresql数据库和相关的命令行工具,以及已经正确配置了数据库的凭证和权限。如果这些条件不满足,你需要先解决这些问题才能顺利导入csv文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值