我想逐行处理文件。但是,这些文件有不同的行分隔符:"\r"
,"\n"
或"\r\n"
。我不知道它们使用的是哪一种或来自哪种操作系统。
我有两个解决方案:
1.使用bash命令将这些分隔符转换为"\n"
。
cat file |
tr '\r\n' '\n' |
tr '\r' '\n' |
ruby process.rb
字符串
1.读取整个文件并gsub这些分隔符
text=File.open('xxx.txt').read
text.gsub!(/\r\n?/, "\n")
text.each_line do |line|
do some thing
end
型
但是当文件很大的时候,第二种解决方案并不好。参见reference。还有其他ruby惯用的高效解决方案吗?
2条答案
按热度按时间uajslkp61#
我建议您首先确定行分隔符。我假设您可以通过阅读字符直到遇到“\n”或“\r”(或者到达文件末尾,这时我们可以把“\n”当作行分隔符)。如果找到字符“\n”,我假设它是分隔符;如果找到“\r”,则尝试读取下一个字符。如果可以读取并且是“\n”,则返回“\r\n”作为分隔符。如果“\r”是文件中的最后一个字符或后跟“\n”以外的字符,则返回“\r”作为分隔符。
字符串
然后逐行处理文件
型
我还没有将
"\r"
或"\r\n"
转换为"\n"
,当然你可以很容易地做到这一点,只要打开一个文件进行写入,在process
中读取每一行,并使用默认的行分隔符将其写入输出文件。让我们尝试一下(为了清楚起见,我显示了
separator
返回的值):型
368yc8dk2#
使用index函数(它给出字符串中第一个出现的子字符串,如果没有找到则返回nil):
字符串
我不确定非常大的文件的性能,但它工作,它的漂亮和短。