我有以下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
答案 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