-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})- 10 位数字(即\d{10})保存在一个名为的组中number
  • $- 字符串的结尾

Ruby 使用正斜杠来分隔正则表达式,并且该match方法返回一个对象,我们可以使用该对象来提取保存的 10 位数字。

于 2013-01-23T11:52:57.070 回答
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 回答
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 回答