views:

54

answers:

2

I want to obtain the information of students in class c79363 ONLY.

The following file(users.txt) contains the user id's

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

The other one contains specific information about a user like in this format

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

Here was my solution but was slow! I want to optimize the speed.

pseudo code

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.
A: 
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
glenn jackman
A: 
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