我是红宝石的新手。我正在尝试解析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。
我不知道该怎么做。
答案 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}
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