Рубиновые регулярные выражения - проблема скорости - PullRequest
0 голосов
/ 04 октября 2010

Я хочу получить информацию о студентах в классе c79363 ТОЛЬКО.

Следующий файл (users.txt) содержит идентификаторы пользователя

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 голосов
/ 05 октября 2010
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
0 голосов
/ 04 октября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...