我有一个文本文件,每行开头都有一个匿名字符,比如空字符串,但不是空白字符,也不是空字符。
示例文字:
Q1
我尝试了各种方法来删除它,但失败了。
all_text = File.open(file_txt, 'r')
all_text.each do |text|
text = text.gsub(/\r\n?/, "")
# debug here
end
[1] pry(main)> text
=> "Q1"
[2] pry(main)> text.length
=> 3
text
有三个字符:
[3] pry(main)> text.split('')
=> ["", "Q", "1"]
尝试删除带有拒绝的空字符,但仍然长度为3。
[4] pry(main)> text.split('').reject(&:empty?).length
=> 3
尝试使用slice!
[5] pry(main)> text.slice!(0)
=> ""
[6] pry(main)> text.length
=> 2
但我认为这是不好的做法。
我有很多文本文件,我认为并非所有文件都在每行的开头都有一个匿名字符,而匿名字符可能不仅仅位于一行的开头。
如何知道匿名角色的类型?我该如何删除?
答案 0 :(得分:1)
它们可能是不可打印的非空字符。
"\ufeff".inspect # => looks like "\"\""
"\ufeff".empty? # => false
您可能希望首先检查您的字符和基础字节。
注意,根据您的语言环境和内容,ruby可能会重新解释用于编码转换的字节。最安全的选择是使用非偏向的面向字节的工具,如xxd
。
如果该字符是固定的或有效的(如在Unicode字节顺序标记的情况下),则应该可以检测它并进行解决。
答案 1 :(得分:0)
问题是如何从文件中删除每行的第一个字符。技术上可以在适当的位置修改文件,但这不是一个好习惯。通常的过程是将没有违规字符的文件写入新文件。如果需要,可以删除原始文件,并将新文件重命名为原始文件的名称。假设每行只删除一个字符,对于所有行,如果该字符像空格一样打印则无关紧要。但是,我将使用一个示例,其中要跳过的字符是一个不间断的空格。
如果只有一些行以违规字符开头,或者如果要在某些或所有行的开头删除多个违规字符,则需要采用不同的方法。在这种情况下,可以构造一个违规字符数组,并使用正则表达式在每行的开头删除它们。
让我们首先构建一个在每行开头有一个不间断空格的文件。
str =<<_
\u00A0Now is the time for all
\u00A0good Rubiests to come to the
\u00A0aid of their bowling team
_
FNameIn = "test_in"
File.write(FNameIn, str)
#=> 85
确认文件内容。
File.foreach(FNameIn) { |line| puts "|#{line.strip}|" }
# | Now is the time for all|
# | good Rubiests to come to the|
# | aid of their bowling team|
逐行读取文件并将每行减去第一个字符写入另一个文件很简单。
FNameOut = "test_out"
File.open(FNameOut, "w+") do |f|
File.foreach(FNameIn) { |line| f.puts(line[1..-1]) }
f.close
end
让我们看看写的是什么。
File.foreach(FNameOut) { |line| puts "|#{line.strip}|" }
# |Now is the time for all|
# |good Rubiests to come to the|
# |aid of their bowling team|
请参阅IO::write,IO::foreach和File::open。通常在类IO
上调用File
方法,因为File
是IO
(File < IO #=> true
)的子类,所以允许这样做。