G'day伙计们,我目前正在使用fastCSV解析ruby中的CSV文件,并想知道如何摆脱CSV上的初始数据行(初始行包含另一个生成的时间/日期信息)软件包)
我尝试使用fasterCSV.table然后删除row(0)然后将其转换为CSV文档然后解析它
但该行仍然存在于文档中。
还有其他想法吗?
fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)
答案 0 :(得分:4)
您可以使用:return_headers =>跳过坏线的真实选项。如果第二行不是真正的标题,这将很有用。有关详情,请参阅here
:return_headers:
如果为false,则标题行是静默的 吞噬。如果设置为true,则标题行 在FasterCSV :: Row中返回 对象具有相同的标题和 字段(除了字段不去 通过转换器。)
你不需要使用Ruby - 如何使用建议的here解决方案切割文件,你可以使用系统方法从Ruby调用单行程序。
您是否考虑直接读取文件,跳过第一行然后接受或拒绝行?我的代码的核心是这个解析方法,它将文件视为一系列行,接受或拒绝每个行。你可以做类似的事情,但跳过第一行。
巧妙的是,您可以通过定义自己的行来确定哪些行可以接受?方法 - 只有有效的CSV数据传递给可接受的?其余的都被扔掉以回应异常。
def parse(file)
#
# Parse data
#
row = []
file.each_line do |line|
the_line = line.chomp
begin
row = FasterCSV.parse_line(the_line)
ok, message = acceptable?(row)
if not ok
reject(file.lineno, the_line, message)
else
accept(row, the_line)
end
rescue FasterCSV::MalformedCSVError => e
reject(file.lineno, the_line, e.to_s)
end
end
答案 1 :(得分:2)
您正在为澳大利亚选举委员会提供一些数据。有问题的文件在第一行有一个日期字符串,第二行有标题
require 'csv'
require 'open-uri'
filename = "http://results.aec.gov.au/15508/Website/Downloads/SenateGroupVotingTicketsDownload-15508.csv"
file = File.open(open(filename))
first_line = file.readline
CSV.parse(file, headers: true).each do |row|
puts row["State"]
end
我认为我引用的文件仍然存在,但可以用相关文件替换。如果你需要跳过更多行,你必须多次调用file.readline。
答案 2 :(得分:1)
根据文档,fTable = FasterCSV.table("sto.csv", :return_headers => false)
应该做你想要的。 .table
暗示:headers => true
The docs有此信息。