Ruby正则表达式 - 速度问题

时间:2010-10-04 18:44:35

标签: ruby regex performance

我想获取课程c79363中学生的信息。

以下文件(users.txt)包含用户ID

c79363::7117:dputnam,gliao01,hmccon01,crober06,cpurce01,cdavid03,dlevin01,jsmith88 
d79363::7117:dputn,gliao0,hmcc01,crob06,cpur01,cdad03,dlen01,jsmh88 
f79363::7117:dpnam,gli01,hmcn01,ober06,crce01,cdav03,dln01,jith88 

FILENAME=user_info.txt

另一个包含有关用户的特定信息,例如此格式

jsmith88:*:4185:208:jsmith113:/students/jsmith88:/usr/bin/bash
userd:*:4185:208:jsmith113:/students/jsmith88:/usr/bin/bash
gliao01:*:4185:208:jsmith113:/students/jsmith88:/usr/bin/bash

这是我的解决方案但很慢!我想优化速度。

伪代码

I read the file using File.readlines(users.txt) ->
I used split(/,/) -> I then pop array until i had an array with the following values
dputnam,gliao01,hmccon01,crober06,cpurce01,cdavid03,dlevin01,jsmith88

I then continue to read user_info.txt with File.readlines(user_info.txt)
I split(/:/) i have USER ARRAY

Finally I compared the first entry USER ARRAY with my users in class c79363.

2 个答案:

答案 0 :(得分:0)

user_info = {}
File.foreach("user_info.txt") {|line| user_info[line[/^[^:]+/]] = line.chomp}

class_name = "c79363"
File.foreach("users.txt") do |line|
    next unless line[/^[^:]+/] == class_name
    line[/[^:]+$/].rstrip.split(/,/).each do |user|
        puts user_info[user] if user_info.has_key?(user)
    end
end

答案 1 :(得分:0)

user_info = {}
File.readlines("users_info.txt").each do |line|
  user_info[line.split(/:/,2)[0]] = line.chomp
end
class_name = "c79363"
File.readlines("users.txt").each do |line|
    line=line.strip.split(/:/)
    if line[0] == class_name then
        line[-1].split(",").each {|u| puts user_info[u] if user_info[u] }
    end
end