G'day 伙计们,我目前正在使用 fasterCSV 来解析 ruby 中的 CSV 文件,并且想知道如何摆脱 CSV 上的初始数据行(初始行包含另一个软件包生成的时间/日期信息)
我尝试使用 fasterCSV.table 然后删除 row(0) 然后将其转换为 CSV 文档然后解析它
但该行仍然存在于文档中。
还有其他想法吗?
fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)
G'day 伙计们,我目前正在使用 fasterCSV 来解析 ruby 中的 CSV 文件,并且想知道如何摆脱 CSV 上的初始数据行(初始行包含另一个软件包生成的时间/日期信息)
我尝试使用 fasterCSV.table 然后删除 row(0) 然后将其转换为 CSV 文档然后解析它
但该行仍然存在于文档中。
还有其他想法吗?
fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)
您可以使用 :return_headers => true 选项跳过坏行。如果第二行不是真正的标题,那会很好用。看这里了解更多
:return_headers:
当为 false 时,标题行会被默默吞下。如果设置为 true,则在 FasterCSV::Row 对象中返回具有相同标题和字段的标题行(除非字段不经过转换器)。
您不需要为此使用 Ruby - 如何使用此处建议的解决方案之一来剪切文件,您可以使用系统方法从 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
您好,使用澳大利亚选举委员会的一些数据来做到这一点。有问题的文件在第一行有日期字符串,在第二行有标题
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 该次数。
根据文档,fTable = FasterCSV.table("sto.csv", :return_headers => false)
应该做你想做的事。.table
暗示:headers => true
文档有此信息。