2013-01-23 66 views
-3

我是新来的红宝石。我正在尝试解析CSV文件中的电话号码,并使用以下代码进行了处理。它工作正常。从解析的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”

我不知道该怎么做。

+0

如果它有11位和第一位不为1,或者如果它有超过11位会发生什么? – sawa

回答

2

你可以用恰当地命名length方法的字符串的长度:

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

可以检查字符串使用另一个字符串开头:

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

您可以切分个人字符串l使用数组索引符号(方括号)和范围的字符。负指数从字符串的末尾开始计数。因此,要返回所有,但第一个字符:

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
  • (?<number>\d{10}) - - 串
  • 1?的开始保存的一组中的10位数字(即\d{10})称为number
  • $ - 字符串

红宝石的端部使用斜线来分隔的正则表达式,以及match方法返回一个对象,我们可以使用以提取所保存的10位数字。

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 
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