电话号码从解析的CSV文件中清除

时间:2013-01-23 11:26:17

标签: ruby

我是红宝石的新手。我正在尝试解析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”
  3. 如果电话号码有11位数且第一位数字为1,则打印最后10位数字(先删除1位),否则“0000000000”
  4. 我不知道该怎么做。

3 个答案:

答案 0 :(得分: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位数字。

答案 1 :(得分: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

答案 2 :(得分: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