字符串开头的匿名字符

时间:2017-03-23 03:02:47

标签: ruby string split

我有一个文本文件,每行开头都有一个匿名字符,比如空字符串,但不是空白字符,也不是空字符。

示例文字:

  

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

但我认为这是不好的做法。

我有很多文本文件,我认为并非所有文件都在每行的开头都有一个匿名字符,而匿名字符可能不仅仅位于一行的开头。

如何知道匿名角色的类型?我该如何删除?

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::writeIO::foreachFile::open。通常在类IO上调用File方法,因为FileIOFile < IO #=> true)的子类,所以允许这样做。