ITPub博客

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

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

原创 MySQL 作者:天空的鹰 时间:2015-08-27 16:08:25 0 删除 编辑

情景:

有一个包含多个系的学生详细信息的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


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


点击(此处)折叠或打开

  1. mysql>
  2. mysql> show databases;
  3. +--------------------+
  4. | Database |
  5. +--------------------+
  6. | information_schema |
  7. | mysql |
  8. | performance_schema |
  9. | students |
  10. | test |
  11. +--------------------+
  12. 5 rows in set (0.00 sec)

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

  17. Database changed
  18. mysql>
  19. mysql> show tables;
  20. +--------------------+
  21. | Tables_in_students |
  22. +--------------------+
  23. | students |
  24. +--------------------+
  25. 1 row in set (0.00 sec)

  26. mysql>
  27. mysql> select * from students;
  28. +------+---------+------+------+
  29. | id | name | mark | dept |
  30. +------+---------+------+------+
  31. | 1 | Navin M | 98 | CS |
  32. | 2 | Kavya N | 70 | CS |
  33. | 3 | Nawaz O | 80 | CS |
  34. | 4 | Hari S | 80 | EC |
  35. | 5 | Alex M | 50 | EC |
  36. | 6 | Neenu J | 70 | EC |
  37. | 7 | Bob A | 30 | EC |
  38. | 8 | Anu M | 90 | AE |
  39. | 9 | Sruthi | 89 | AE |
  40. | 10 | Andrew | 89 | AE |
  41. +------+---------+------+------+
  42. 10 rows in set (0.00 sec)

  43. mysql>


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

请登录后发表评论 登录
全部评论
多年数据库运维和架构经验,对 MySQL、Oracle、PostgreSQL、Greenplum、MongoDB 等多种常见数据库有丰富的运维实践经验,擅长数据库架构设计、维护优化、数据流转、Shell 和 Python 开发;乐于技术交流,网名 yumushui 进行了大量的技术总结和思考分享。

注册时间:2015-05-21

  • 博文量
    18
  • 访问量
    42715