-3

私はルビーに不慣れです。CSVファイルから電話番号を解析しようとしていますが、次のコードを使用して解析しました。正常に動作しています。

require 'csv' 
csv_text = File.read('file.csv')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|                                      
    puts "Home Phone: #{row['HomePhone']}"
end

私が欲しいのは、次の方法でHomePhoneをクリーンアップすることです。

  1. 電話番号が10桁の場合は、そのまま印刷してください。
  2. 電話番号が10桁未満の場合は、無効な番号を「0000000000」と出力します</ li>
  3. 電話番号が11桁で、最初の桁が1の場合、最後の10桁を印刷し(最初の1を削除)、それ以外の場合は「0000000000」</ li>

これを行う方法がわかりません。

4

3 に答える 3

2

length適切な名前のメソッドを使用して、文字列の長さを取得できます。

string = 'foobar'
string.length # => 6

文字列が別の文字列で始まるかどうかは、次を使用して確認できますstart_with?

string.start_with?('f') # => true

配列の添字表記(角括弧)と範囲を使用して、文字列の個々の文字をスライスできます。負のインデックスは、文字列の末尾からカウントされます。したがって、最初の文字を除くすべてを返すには、次のようにします。

string[1..-1] # => 'oobar'

だからあなたが求めていることをするためにあなたはこれらを組み合わせることができます

home_phone = row['HomePhone']
if home_phone.length == 10
  puts home_phone
elsif home_phone.length == 11 && home_phone.start_with?('1')
  puts home_phone[1..-1]
else
  puts '0000000000'
end

このアプローチでは、電話番号がすでに数字の文字列であり、その長さを確認するだけでよいと想定していることに注意してください。より徹底して、のように数字以外を含む無効な電話番号をチェックしたい場合は123z567890、正規表現のアプローチを検討してください。

if match = /^1?(?<number>\d{10})$/.match(row['HomePhone'])
  puts match[:number]
else
  puts '0000000000'
end

この正規表現が一致するコンポーネントは次のとおりです。

  • ^-文字列の先頭
  • 1?-オプション1
  • (?<number>\d{10})\d{10}-というグループに保存された10桁(つまり)number
  • $-文字列の終わり

Rubyはスラッシュを使用して正規表現を区切り、matchメソッドは保存された10桁の数値を抽出するために使用できるオブジェクトを返します。

于 2013-01-23T11:52:57.070 に答える
0

以下のコードを試してください

csv.each do |row|
   phone_number = row['HomePhone'].to_s
   if phone_number.length == 10
     puts "Home Phone: #{phone_number}"
   elsif phone_number.length == 11 && phone_number[0] == "1"
     puts "Home Phone: #{phone_number[1..10]}"
   else
     puts "Home Phone: 0000000000"
   end
end
于 2013-01-23T11:47:03.597 に答える
0

これを各ブロックに入れます。

phone_number = row['HomePhone']
if phone_number.length == 10
  puts "Home Phone: #{row['HomePhone']}"
elsif (phone_number.length == 11 and x[0] == "1")
  phone_number.slice!(0)        # remove first character
  puts phone_number
else
  puts "0000000000" 
end
于 2013-01-23T11:54:18.703 に答える