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

情景:

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

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

点击(此处)折叠或打开

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

脚本思路:

这个问题有两种处理思路,从shell脚本的角度看,可以用sort,awk等bash工具解决,也可以用一个sql数据库的数据表也可以解决。

下面需要编写3个脚本,分别用于创建数据库及数据表、想数据表中插入学生数据、从数据表中读取并显示处理过的数据。


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


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

点击(此处)折叠或打开

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

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

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

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

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

  20. mysql -u $USER -p$PASS -S $SOCKET students <<EOF
  21. delete from students;
  22. EOF



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

点击(此处)折叠或打开

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

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

  7. if [ $# -ne 1 ];
  8. then
  9.     echo $0 DATAFILE
  10.     echo
  11.     exit 2
  12. fi
  13. data=$1

  14. while read line;
  15. do
  16.     oldIFS=$IFS
  17.     IFS=,
  18.     values=($line)
  19.     values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
  20.     values[3]="\"`echo ${values[3]}`\""

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

  27. done< $data
  28. echo Wrote data into DB


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

点击(此处)折叠或打开

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

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

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

  10. for d in $depts;
  11. do

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

  17. echo "$result"
  18. echo

  19. done


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

点击(此处)折叠或打开

  1. # chmod +x create_db.sh write_to_db.sh read_db.sh
  2. # ./create_db.sh
  3. DB already exist
  4. Table students already exist
  5. #
  6. # ./write_to_db.sh studentdata.csv
  7. Wrote data into DB
  8. #
  9. # ./read_db.sh
  10. Department : CS
  11. rank name mark
  12. 1 Navin M 98
  13. 2 Nawaz O 80
  14. 3 Kavya N 70

  15. Department : EC
  16. rank name mark
  17. 1 Hari S 80
  18. 2 Neenu J 70
  19. 3 Alex M 50
  20. 4 Bob A 30

  21. Department : AE
  22. rank name mark
  23. 1 Anu M 90
  24. 2 Sruthi 89
  25. 3 Andrew 89


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


点击(此处)折叠或打开

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>


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24638123/viewspace-1784198/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24638123/viewspace-1784198/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值