ruby:读取带有列名称的引号的cvs

时间:2017-04-28 13:11:23

标签: ruby csv

我有以下csv:

"id","title"
1070,"\"stern\" Abo"
1071,"stern_de"

要只阅读我可以执行的第一列:

CSV.foreach(a, :headers => true, :quote_char => "'") do |row| b.push(row[0]) end

但是,我想通过列名而不是索引来解决列。

上面的命令返回一个填充了nils的数组b

CSV.foreach(a, :headers => true, :quote_char => "'") do |row| b.push(row['title']) end

1 个答案:

答案 0 :(得分:0)

你的问题正在发生,因为你已经被骗了#34;在如何使用'解析CSV文件中的转义引号。引号字符 ",它仍然只是CSV.foreach(a, :headers => true, :quote_char => "'") do |row| row['"title"'] end 的默认值!

在不修复此错误的情况下,可以通过其标题访问每一列,包括您无意中包含的额外引号:

text = File.read('your-input-file.csv').gsub(/\\"/,'""')
CSV.parse(text, headers: true) do |row|
  b.push(row['title'])
end

但是,正如this post中所述,更好的解决方案是首先将数据转换为有效的 ruby​​ CSV结构,然后正常访问它 - 例如:

@retry(wait_exponential_multiplier=250,
           wait_exponential_max=4500,
           stop_max_attempt_number=8,
           retry_on_result=lambda failures_count: failures_count > 0)
def put():
    global non_delivered_tweets

    logger.info("Executing Firehose put_batch command on {} tweets".format(len(non_delivered_tweets)))
    response = firehose.put_record_batch(DeliveryStreamName=firehose_stream_name, Records=non_delivered_tweets)

    failures_count = response["FailedPutCount"]
    failures_list = []
    if failures_count > 0:
        for index, request_response in enumerate(response["RequestResponses"]):
            if "ErrorCode" in request_response:
                failures_list.append(non_delivered_tweets[index])

    non_delivered_tweets = failures_list
    return failures_count