最近在用ruby处理一些数据,这里记下ruby使用时遇到的一些问题。
功能:把更新好的sql文件导入到指定数据库,更新好后对比更新前后该表的md5值
1. 获取路径函数
1获得当前执行文件的文件名:
__file__
2获得当前文件的目录
file.dirname(__file__)
3获得当前执行文件的完整路径
require ‘pathname’
pathname.new(__file__).realpath
2. 扫描文件
path扫描下的全部文件
require 'find'
find.find(path) do |f|
使用string的函数.include对文件名进行筛选
f.include?tag #f中是否包含tag 是返回true 否返回false
不知道是我写法有误还是如何
在三个条件取并的情况下会提示出错,即使我每个条件加上括号都是提示出错最后只好这样写。
if res1 && res2 && res3
3. ruby与mysql
鉴于只是单纯的插入数据跟提取数据就不使用mysql的api了,之前图省事觉得用个api就是顺手拈来的事情,没想到windows下转个mysql的gem是何其的难,下了mysql的gem安装会提示本地编译环境不对,需要安装devkit,觉得过于繁琐。导入sql只要一句cmd命令就可以了,导出比较麻烦但觉得比安装api方便。虽然不知道导出的方法但是既然能输出就肯定能拿到数据。
1使用system函数执行cmd命令导入sql
command = mysql -u #{user} -p#{pass} #{ip} database
system(command)
#{user} -p#{pass} #{ip} 分别为已定义的user,pass,ip,字符串变量,sqllist[0]为sql文件名,database为数据库
2使用system函数执行cmd命令导出数据表
鉴于原来在网页的做法是获取数据表的数据按字段列排列在内存是连续的一块字符串。于是先让数据导出到文件(实在不知道怎么导出到内存)
command = mysql -u #{user} -p#{pass} -n-e'select * from table' database > 233.txt
user,pass同上 –e后面是sql语句,其它的语句也可以。table为表名,database为数据库名,233.txt为导出的文件名。
再从文件读入到内存
iffile.exist?(233.txt)
file.open(233.txt,r) do |file|
whileline = file.gets
str+= line.gsub(/[/s]/, '') #每行对其使用正则表达式去掉空格
end
end
end
顺便mark一下正则表达式
一般规则
/a/匹配字符a。
//?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, /, [, ], {, }, (, ), +, *.
.匹配任意字符,例如/a./匹配ab和ac。
/[ab]c/匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-za-z0-9]/。
/[^a-za-z0-9]/匹配不在该范围内的字符串。
/[/d]/代表任意数字
/[/w]/代表任意字母,数字或者_
/[/s]/代表空白字符,包括空格,tab和换行。
/[/d]/,/[/w]/,/[/s]/均为上述的否定情况。
高级规则
?代表0或1个字符。/mrs?/.?/匹配mr,mrs,mr.,mrs.。
*代表0或多个字符。/hello*/匹配hello,hellojack。
+代表1或多个字符。/a+c/匹配:abc,abbdrec等等。
/d{3}/匹配3个数字。
/d{1,10}/匹配1-10个数字。
/d{3,}/匹配3个数字以上。
/([a-z]/d){5}/匹配首位是大写字母,后面4个是数字的字符串。
4. 计算md5
require 'digest/md5'
checksum = digest::md5.hexdigest(str)
最后,ruby用来写快速处理数据还是很方便的,一旦有需要进行调试的时候就显得不方便,在去掉string的空格包括换行后数据输出依然有换行,计算结果还暂时不能对比不知道是否结果包含换行。也可能是我使用的方式不对……
