ruby - CSV.foreach不读取CSV文件中的第一列

标签 ruby csv

第一次学习Ruby,可以自动清理一些CSV文件。

我已经设法将其他SO问题中的脚本拼凑在一起,但是由于某种原因,该脚本无法读取原始CSV文件的第一列。如果我添加一个虚拟的第一列,那么一切都将正常运行。我想念什么?

require 'csv'

COLUMNS = ['SFID','Date','Num','Transaction Type']

CSV.open("invoicesfixed.csv", "wb",
  :write_headers=> true,
  :headers => ["Account__c","Invoice_Date__c","Invoice_Number__c","Transaction_Type__c"]) do |csv|

  CSV.foreach('invoices.csv', :headers=>true, :converters => :all) do |row|


    #convert date format to be compatible with Salesforce
    row['Date'] = Date.strptime(row['Date'], '%m/%d/%y').strftime('%Y-%m-%d')
    csv << COLUMNS.map { |col| row[col] }

  end
end

此输入文件:
Transaction Type,Date,Num,SFID
Invoice,7/1/19,151466,SFID1
Invoice,7/1/19,151466,SFID2
Invoice,7/1/19,151466,SFID3
Invoice,7/1/19,151466,SFID4
Invoice,7/1/19,151466,SFID5
Invoice,7/1/19,151466,SFID6
Invoice,7/1/19,151153,SFID7
Sales Receipt,7/1/19,149487,SFID8
Sales Receipt,7/1/19,149487,SFID9
Sales Receipt,7/1/19,149758,SFID10
Sales Receipt,7/1/19,149758,SFID11

产生以下输出:
Account__c,Invoice_Date__c,Invoice_Number__c,Transaction_Type__c
SFID1,2019-07-01,151466,
SFID2,2019-07-01,151466,
SFID3,2019-07-01,151466,
SFID4,2019-07-01,151466,
SFID5,2019-07-01,151466,
SFID6,2019-07-01,151466,
SFID7,2019-07-01,151153,
SFID8,2019-07-01,149487,
SFID9,2019-07-01,149487,
SFID10,2019-07-01,149758,
SFID11,2019-07-01,149758,

但是,此输入:
Dummy,Transaction Type,Date,Num,SFID
,Invoice,7/1/19,151466,SFID1
,Invoice,7/1/19,151466,SFID2
,Invoice,7/1/19,151466,SFID3
,Invoice,7/1/19,151466,SFID4
,Invoice,7/1/19,151466,SFID5
,Invoice,7/1/19,151466,SFID6
,Invoice,7/1/19,151153,SFID7
,Sales Receipt,7/1/19,149487,SFID8
,Sales Receipt,7/1/19,149487,SFID9
,Sales Receipt,7/1/19,149758,SFID10
,Sales Receipt,7/1/19,149758,SFID11

产生以下内容的正确输出:
Account__c,Invoice_Date__c,Invoice_Number__c,Transaction_Type__c
SFID1,2019-07-01,151466,Invoice
SFID2,2019-07-01,151466,Invoice
SFID3,2019-07-01,151466,Invoice
SFID4,2019-07-01,151466,Invoice
SFID5,2019-07-01,151466,Invoice
SFID6,2019-07-01,151466,Invoice
SFID7,2019-07-01,151153,Invoice
SFID8,2019-07-01,149487,Sales Receipt
SFID9,2019-07-01,149487,Sales Receipt
SFID10,2019-07-01,149758,Sales Receipt
SFID11,2019-07-01,149758,Sales Receipt

有什么想法可能会发生这种情况吗?

最佳答案

我有一个类似的问题,尽管运行您的示例可以。
我意识到问题(至少对我而言)是我正在使用Excel中的“另存为UTF-8 CSV”来创建CSV文件。
这会将BOM添加到文件的开头-在第一个列标题名称之前,因此row ['firstColumnName']返回nil。
将文件另存为CSV对我来说解决了这个问题。

关于ruby - CSV.foreach不读取CSV文件中的第一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57418707/

相关文章:

ruby - 如何找到 Ruby 中两个 Date 对象之间的天数?

ruby-on-rails - 如何编写 Rails 4 测试以使用 omniauth-google-oauth2 gem 创建 session ?

python - Python 中的简单数据存储

python - 从具有日期索引的多个 csv 文件创建 pandas DataFrame

r - 通过可共享的谷歌驱动器链接将 csv 读入 R

python - 如何修复错误引用的 CSV 文件以允许使用 csv 模块解析它们?

python - 通过选择 csv 中的列来构建字符串

ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别

ruby-on-rails - rails 4.0 中的多个 'root to' 路由

ruby - 检查整数数组是否在 Ruby 中递增