如何将字符串数组转换为逗号分隔的字符串?

72

我有一个数组:

array = ["10", "20", "50", "99"]

我想将它转换为一个简单的逗号分隔字符串列表,如下所示:

"10", "20", "50", "99"
7个回答

130

array.join(',')几乎可以实现你想要的功能;它不会保留值周围的引号或后面的空格。

如果要保留引号和空格:array.map{|item| %Q{"#{item}"}}.join(', ') 这将打印"\"10\", \"20\", \"50\", \"99\""。 假设问题确实要求单个字符串,则转义引号是必需的。

关于%Q的文档:字符串文字

可以另一个答案中建议的那样使用inspect,我认为这是个人喜好。 对于自己选择,请查看inspect源代码

有用的提示:array.to_sentence将给您提供“1、2、3和4”样式的输出,这可能很好!


5
不,不会的。Join不会给他报价。 - Linuxios
7
请注意,to_sentence 只存在于 ActiveSupport 中的 Rails 中。 - Linuxios
13
在 Rails 3.2.5 中测试过,array.to_sentence 默认会包含牛津逗号。如果想要排除牛津逗号,可以使用 array.to_sentence(:last_word_connector => " and ") - niiru
2
to_sentence非常有用,我之前不知道它的存在! - bcb
@RahulDess 谢谢Rahul,我已经更新了答案以使其更准确。 - Matt
显示剩余4条评论

89
["10", "20", "50","99"].map(&:inspect).join(', ') # => '"10", "20", "50", "99"'

4
map{|v| v.to_s.inspect}可以处理整数和字符串类型的值。 - tadman
当数组元素包含 " 时会发生什么? - dbenhur
["10", ''].map(&:inspect).join(', ') # => '"10", ""' - sczizzo
8
在代码审查中,我会因此而失败。inspect 不应该以这种方式使用。 - Mark Thomas
@MarkThomas,你会如何获得所需的输出? - dax
1
@Linuxios 的回答在我看来是正确的。另一种变化形式为:'arr.map { |a| %Q("#{a}") }.join(", ")'。 - Mark Thomas

19

这里:

array.map {|str| "\"#{str}\""}.join(',')

我得到了这个输出 => ""10","20","50","99"" - Kashiftufail
4
输出是正确的。反斜杠只是表示这是一个字面引用,而不是语法引用。 - tadman
2
@ali:这是正确的输出。\ 是转义字符,所以 \" 代表字符 " ,而开头和结尾的简单 " 是字符串定界符。您可能正在使用 p x 打印结果,它等同于 puts x.inspect,请尝试改为使用 puts x - Patrick Oscity
@dbenhur:然后你会得到这个字符串:""" - Linuxios
当你打印 """ 时,你会得到什么?我猜不会有太多东西。 - tadman
显示剩余3条评论

10

几个答案都提供了使用 #map#inspect#join 的解决方案。但是,所有这些方案都无法正确处理包含嵌入逗号和/或字符串定界符元素的边缘情况的 CSV 编码细节。

使用标准库类CSV可能是一个更好的主意,而不是自己编写代码。

irb> require 'csv'
=> true
irb> a = [10,'1,234','J.R. "Bob" Dobbs',3.14159]
=> [10, "1,234", "J.R. \"Bob\" Dobbs", 3.14159]
irb> puts a.to_csv
10,"1,234","J.R. ""Bob"" Dobbs",3.14159

如果这种编码不需要考虑嵌入分隔符,或者只是为某个内部表示而设计,那么map.join解决方案已经足够了,但是如果要生成数据以便与其他程序交换,这些程序期望逗号分隔值(CSV)作为一种通用的表示形式,则它们将失败。


我认为他只是想要字符串表示,而不是完整的 CSV。 - Linuxios
生成一个字符串数组非常方便,然后可以将其作为CSV的一个字段导出,与其他值一起使用。 - jethroo

5
最简单的解决方案是使用内置的“.to_sentence”方法。
因此,["fred", "john", "amy"].to_sentence 将输出 "fred, john, and amy"。

“.to_sentence” 很好用,但它不能提供所需的输出。 - Tony Beninate

3
这是一种稍微不同的解决方案,特别适用于需要将带有双引号字符串的数组转换为单引号列表(例如SQL查询)的情况:
"'#{["John Oliver", "Sam Tom"].join("','")}'"

to

'John Oliver', 'Sam Tom'

来源: https://alok-anand-ror.blogspot.com/2014/04/ruby-join-array-elements-with-single.html

这篇文章介绍了在 Ruby 编程语言中如何使用单个分隔符将数组元素连接起来。

0
这是如何使用FCM为Android设备发送推送通知的方法。 假设您想在用户发布状态时通知关注者,以下是您可以执行的操作。这是在Rails 5.2.6中为Rest Apis完成的,但仍然可以将其用于Web推送通知。这是用于向具有registration_ids的多个设备发送通知以针对关注者进行目标定位的方法。 Gem:fcm 在您的控制器中:
require "fcm"

def create_vibe(user)
  @vibe = user.vibes.new(content: @content, picture: @picture, video: @video, isvideofile: @isvideofile, video_thumbnail: @video_thumbnail, source: @source, background_color: @background_color)
  @followed = user.followers
  if @followed.present?
    @registration = @followed.map { |s| s.registration_id }
  end
  if @vibe.save
    fcm = FCM.new("") # set your FCM_SERVER_KEY

    options = {
      data: {
        notification_type: 1,
        title: "#{@vibe.user.username} " "has posted a new Vibe",
        body: "#{@vibe.content}",
        user_data: {
          vibe_id: @vibe.id,
          user_id: @vibe.user.id,
          background_color: @background_color,

        },
      },
    }
    response = fcm.send(@registration, options)
    puts response
    render :status => 200,
      :json => { :success => true,
                :info => "Vibe posted successfully",
                :vibe_info => {
        :content => @content,
        :picture => @picture,
        :video => @video,
        :video_thumbnail => @video_thumbnail,
        :isvideofile => @isvideofile,
        :source => @source,
        :fcm => options,
      } }
  else
    render :status => 200, :json => { :success => false, :result => "Vibe can't be blank" }
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接