2017-03-23 21 views
1

空の文字列のように各行の先頭に不自然な文字を含むテキストファイルがありますが、空でも空でもありません。文字列の先頭にある匿名の文字

例のテキスト:私はそれを除去するためのさまざまな方法を試してみましたが、失敗した

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つの文字があります拒否で

[3] pry(main)> text.split('') 
=> ["", "Q", "1"] 

は、空の文字を削除しようとしましたが、それでもそれは長さslice!

でそれを削除しようとしました。3.

[4] pry(main)> text.split('').reject(&:empty?).length 
=> 3 

を持っています

[5] pry(main)> text.slice!(0) 
=> "" 
[6] pry(main)> text.length 
=> 2 

でも、それは悪い習慣だと思います。

私は多くのファイルを持っていますが、すべてのファイルが各行の冒頭に匿名の文字を持つわけではないと思います。匿名の文字は行の先頭にあるだけではありません。

匿名の文字の種類を知るにはどうすればよいですか?どうすれば削除できますか?

+1

実際に何が存在するかを見るには、16進エディタでテキストファイルを見てください。あるいは、Rubyで 'text.chars'と' text.bytes'を見てください。 –

+0

[異常](https://www.merriam-webster.com/dictionary/anomalous)を意味しますか? – tadman

+0

「匿名のキャラクター」とは何ですか?私はそのような事を聞いたことがない。この用語には、広く知られた受け入れられた定義がないようです。よく知られていない用語を使用する場合は、一般的に正確な定義を提供して、あなたが話していることを理解する必要があります。たとえば、Unicode Consortiumは、Unicode文字セットの各文字に名前を割り当てます。その意味では、「匿名文字」のようなものはまったく存在しないため、その可能性を理解することは困難ですあなたの文字列に1つ。とにかく、そのキャラクターはなんであれ、それは一番です... –

答えて

1

印刷できない空でない文字である可能性があります。

"\ufeff".inspect # => looks like "\"\"" 
"\ufeff".empty? # => false 

最初あなた文字、および基礎となるバイトを検査することをお勧めします。

注:あなたのロケールや内容に応じて、ルビは変換をエンコードするためにバイトを再解釈することがあります。最も安全なオプションは、xxdのようなバイアスされていないバイト指向のツールを使用することです。

(Unicodeバイトオーダーマークの場合のように)その文字が固定または有効である場合、それを検出して回避することが可能でなければなりません。

0

各行の最初の文字をファイルからどのように削除できるかを質問します。ファイルを修正することは技術的に可能ですが、それは良い方法ではありません。通常の手順では、違反していない文字を新しいファイルに書き込むことです。必要に応じて、元のファイルを削除し、新しいファイルの名前を元のファイルの名前に変更することができます。 1行に1文字ずつ削除するようにしてください。すべての行について、その文字が空白のように表示されるかどうかは関係ありません。しかし、スキップされる文字が改行されないスペースである例を使用します。

いくつかの行だけが問題の文字で始まっている場合、またはいくつかの行またはすべての行の先頭で複数の違反文字が削除された場合は、異なるアプローチが必要です。この場合、問題のある文字の配列を作成し、正規表現を使用して各行の先頭で削除することができます。

まず、各行の先頭に改行なしのスペースが1つあるファイルを作成してみましょう。

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| 

ファイルを1行ずつ読み込み、各行から最初の文字を差し引いて別のファイルに書き込むことは簡単です。

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を参照してください。 は(File < IO #=> true)のサブクラスであるため許可されているクラスFileで一般的に呼び出されます。

関連する問題