У меня есть файл в несколько сотен мегабайт, содержащих строки:Синтаксический большую строку в Рубине
str1 x1 x2\n
str2 xx1 xx2\n
str3 xxx1 xxx2\n
str4 xxxx1 xxxx2\n
str5 xxxxx1 xxxxx2
где x1
и x2
некоторые цифры. Насколько велики цифры x(...x)1
и x(...x)2
есть, неизвестно.
В каждой строке есть "\n"
. У меня есть список строк str2
и str4
.
Я хочу найти соответствующие номера для этих строк.
Что я делаю довольно проста (и, вероятно, не является эффективным производительность мудрым):
source_str = read_from_file() # source_str contains all file content of a few hundred Megabyte
str_to_find = [str2, str4]
res = []
str_to_find.each do |x|
index = source_str.index(x)
if index
a = source_str[index .. index + x.length] # a contains "str2"
#?? how do I "select" xx1 and xx2 ??
# and finally...
# res << num1
# res << num2
end
end
Обратите внимание, что я не могу применить source_str.split("\n")
из-за ошибки ArgumentError: invalid byte sequence in UTF-8
и я не могу исправить это путем изменения файла в любом случае. Файл не может быть изменен.
Что такое 'read_from_file()'? Вы сразу же вырываете весь файл в память? Это вряд ли возможно. Вместо этого рассмотрите возможность использования 'foreach' и итерации по файлу по очереди. Это так же быстро и гораздо более масштабируемо. Нам нужны лучшие входные образцы. Дайте нам разумные примеры для 'str2' и' str4'. На какой ОС вы работаете? –
read_from_file() - метод, который возвращает целое содержимое файла, сказано. –
«[Почему повреждение файла плохо?] (Http://stackoverflow.com/q/25189262/128421) объясняет, почему вы не хотите читать весь файл в памяти. –