如何将数组中的字符串拆分为两个?

时间:2014-04-18 10:34:37

标签: ruby string

我目前只有一个列CSV文件,例如:["firstname lastname", "firstname lastname", ...]

我想创建一个CSV文件,例如["f.lastname", "f.lastname"...]; f是名字的第一个字母。

知道我应该怎么做吗?

更新

好吧,我觉得我很感谢你们,这是我到目前为止所得到的:

  require 'csv'
  filename = CSV.read("mails.csv")
  mails = []
  CSV.foreach(filename) do |col|
   mails << filename.map { |n| n.sub(/\A(\w)\w* (\w+)\z/, '\1. \2') }
  end
  puts mails.to_s

但我仍然收到错误。

UPDATE2

好的,这很好用:

require 'csv'
mails = []
CSV.foreach('mails.csv', :headers => false) do |row|
  mails << row.map(&:split).map{|f,l| "#{f[0]}.#{l}@mail.com" }
end
File.open("mails_final.csv", 'w') {|f| f.puts mails }
puts mails.to_s 

非常感谢你们所有人;)

3 个答案:

答案 0 :(得分:4)

不使用正则表达式的解决方案:

ary = ["firstname lastname", "firstname lastname"]
ary.map(&:split).map{|f, l| "#{f[0]}. #{l}" }
#=> ["f. lastname", "f. lastname"]

答案 1 :(得分:1)

ary = ["firstname lastname", "firstname lastname"]
ary.map{|a| e=a.split(" "); e[0][0]+"."+e[1]}
#=> ["f.lastname", "f.lastname"]

您需要修改以下代码: -

CSV.foreach(filename) do |col|
  mails << filename.map { |n| n.sub(/\A(\w)\w* (\w+)\z/, '\1. \2') }
end

匹配以下内容: -

CSV.foreach(path_to_csv_file/mails.csv, headers: true/false) do |row|
  # row is kind _of CSV::Row, do not use filename.map => causing error
  mails << row.to_hash.map { |n| n.sub(/\A(\w)\w* (\w+)\z/, '\1. \2') }
end

答案 2 :(得分:0)

我会这样做:

array = ["firstname lastname", "firstname lastname"]
array.map { |n| "#{n[0]}.#{n.split[1]}" }