在Ruby中解析一个大字符串

在Ruby中解析一个大字符串,ruby,regex,parsing,ruby-2.0,Ruby,Regex,Parsing,Ruby 2.0,我有一个几百兆字节的文件,其中包含字符串: 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的大小未知 每行中都有in“\n”。我有一个字符串列表str2和str4 我想找到这些字符串的对应数字 我所做的是非常简单的(并且可能不是高效的性能): source_str=read_from_file()#source_str包

我有一个几百兆字节的文件,其中包含字符串:

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
的大小未知

每行中都有in
“\n”
。我有一个字符串列表
str2
str4

我想找到这些字符串的对应数字

我所做的是非常简单的(并且可能不是高效的性能):

source_str=read_from_file()#source_str包含数百兆字节的所有文件内容
str_to_find=[str2,str4]
res=[]
str_to_find.each do|x|
索引=源结构索引(x)
如果索引
a=源代码_str[index..index+x.length]#a包含“str2”
#?? 如何“选择”xx1和xx2??
#最后。。。

#res如果你想在一个文本文件中找到一行,听起来像是在读,那么逐行读文件

IO类有这样一个方法,它可以很容易地逐行读取文件,还可以很容易地找到包含要查找的特定字符串的行

如果将源输入文件另存为“foo.txt”,则可以使用以下方式读取:

str2 = 'some value'
str4 = 'some other value'
numbers = []
File.foreach('foo.txt') do |li|
  numbers << li.split[2] if li[str2] || li[str2]
end
str2='some value'
str4='其他值'
数字=[]
File.foreach('foo.txt')do|li|

数字如果你想在一个文本文件中找到一行,听起来像是在读,那么逐行读文件

IO类有这样一个方法,它可以很容易地逐行读取文件,还可以很容易地找到包含要查找的特定字符串的行

如果将源输入文件另存为“foo.txt”,则可以使用以下方式读取:

str2 = 'some value'
str4 = 'some other value'
numbers = []
File.foreach('foo.txt') do |li|
  numbers << li.split[2] if li[str2] || li[str2]
end
str2='some value'
str4='其他值'
数字=[]
File.foreach('foo.txt')do|li|
数字您希望避免向内存中读取100兆字节,以及重复扫描它们。这可能会花费很长时间,同时会阻塞机器的可用内存

尝试重新设置问题的框架,这样您就可以将大型输入文件视为一个流,因此,不要询问要查找的每个字符串“它是否存在于我的文件中?”,而是尝试询问文件中的每一行“它是否包含我要查找的字符串?”

另外,请再次阅读@theTinMan关于文件编码的回答-他建议您可以微调文件的读取以避免错误,而无需更改文件本身

如果要查找的
str\u中有大量项,我建议您使用a而不是
数组
,以获得更好的性能:

str_to_find = [str1, str2, ... str5000].to_set
您希望避免向内存中读取数百兆字节,以及重复扫描它们。这可能会花费很长时间,同时会阻塞机器的可用内存

尝试重新设置问题的框架,这样您就可以将大型输入文件视为一个流,因此,不要询问要查找的每个字符串“它是否存在于我的文件中?”,而是尝试询问文件中的每一行“它是否包含我要查找的字符串?”

另外,请再次阅读@theTinMan关于文件编码的回答-他建议您可以微调文件的读取以避免错误,而无需更改文件本身

如果要查找的
str\u中有大量项,我建议您使用a而不是
数组
,以获得更好的性能:

str_to_find = [str1, str2, ... str5000].to_set

什么是从文件()中读取?您正在将整个文件一次写入内存?这很难扩展。取而代之的是,考虑使用<代码> Frace并逐行地对文件进行迭代。它同样快速,而且可扩展性更强。我们需要更好的输入样本。请给我们提供有关
str2
str4
的合理示例。您使用的是什么操作系统?read_from_file()-一种返回文件全部内容的方法,据说。”解释了为什么您不想将整个文件读入内存。如果您发现至少有一个答案有用,请不要忘记选择一个。什么是
read_from_file()?你一次把整个文件都存储到内存中,这几乎是不可扩展的。相反,考虑使用<代码>前缀< /Cord>并逐行地对文件进行迭代。它同样快,而且更可扩展。我们需要更好的输入示例。给我们一些合理的例子:<代码> STR2和<代码> STR4。你是做什么操作的?read_from_file()-一种返回文件全部内容的方法,据说。“解释了为什么不想将整个文件读入内存。如果您发现至少有一个答案有用,请不要忘记选择一个。
如果您想在文本文件中找到一行,听起来好像您正在阅读,然后逐行阅读文件。
-为什么更好?我必须找到一个值列表,遍历每一行似乎是不明智的,因为我必须对每个值进行一次又一次的迭代。
你说你有一个编码错误,但你没有告诉我们是什么字符导致的。
-你应该仔细阅读我写的内容。你不需要线索,因为有线索意味着你将以某种方式更改源文件,这在我的情况下是不可能的,它不能被触摸,因为它可能会更改一些文本,因此我无法找到它。感谢“拆分”方法,我不知道它可能不需要任何参数。最后一件事是你应该仔细阅读我写的内容。你不需要线索,因为有了线索意味着你要以某种方式改变一个源文件,这在我的例子中是不可能的,我猜你的文件一定是量子文件。你是怎么做到的?
如果你想在一个文本文件中找到一行,听起来像是在阅读,那么就逐行阅读文件。
-为什么更好?我必须找到一个值列表,迭代t