Как пропустить первую строку в CSV, которая не является & ldquo; header row & rdquo; с Rails? [Дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
4
задан the Tin Man 12 November 2014 в 22:47
поделиться

5 ответов

Я не думаю, что есть элегантный способ сделать это, но это можно сделать:

require "csv"

# Create a stream using the original file.
# Don't use `textmode` since it generates a problem when using this approach.
file = File.open "file.csv"

# Consume the first CSV row.
# `\r` is my row separator character. Verify your file to see if it's the same one.
loop { break if file.readchar == "\r" }

# Create your CSV object using the remainder of the stream.
csv = CSV.new file, headers: true
4
ответ дан Gabriel de Oliveira 19 August 2018 в 15:20
поделиться

Этот простой код работал для меня. Вы можете прочитать CSV-файл и проигнорировать его первую строку, которая является заголовком или именами полей:

CSV.foreach(File.join(File.dirname(__FILE__), filepath), headers: true) do |row|
    puts row.inspect
end

Вы можете делать все, что захотите, с помощью row. Не забудьте использовать headers: true

-1
ответ дан Aboozar Rajabi 19 August 2018 в 15:20
поделиться
  • 1
    В вопросе задается вопрос о том, как обрабатывать CSV, где первая строка not заголовок, но некоторый барахл, который необходимо игнорировать: заголовок является второй строкой. – Wayne Conrad 16 May 2018 в 04:17

Вы можете сделать это

text = File.readlines("file.csv")[1..-1].join()
csv = CSV.parse(text, headers: true)
0
ответ дан Dapeng114 19 August 2018 в 15:20
поделиться

В зависимости от ваших данных вы можете использовать другой подход с skip_lines -option

. В этом примере пропустите все строки с ведущим #

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^#/  #Mark comments!
  ) do |row|
  p row
end
#~ 
__END__
#~ Comment
#~ More comment
a;b;c;d
1;2;3;4
#~ More comment
1;2;3;4
#~ More comment
1;2;3;4

. Результат

#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">
#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">
#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">

В вашем случае csv содержит дату, поэтому вы можете использовать:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^\d\d\d\d-\d\d-\d\d$/  #Skip line with date only
  ) do |row|
  p row
end
#~ 
__END__
2016-03-19
a;b;c;d
1;2;3;4
1;2;3;4
1;2;3;4

, или вы можете использовать более длинные стартовые строки:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^Created by/  #Skip line with date only
  ) do |row|
  p row
end

__END__
Created by test.rb on 2016-03-19
a;b;c;d
1;2;3;4
1;2;3;4
1;2;3;4
4
ответ дан knut 19 August 2018 в 15:20
поделиться

У меня была такая же проблема (за исключением того, что я хотел пропустить более 1 строки в начале) и столкнулся с этим вопросом, ища подходящее решение. Для моего случая я пошел с кодом, описанным в , на этот ответ на аналогичный вопрос , за исключением того, что я также использую параметр заголовков, как вы упомянули, что вы хотели сделать.

CSV.parse(File.readlines(path).drop(1).join, headers: true) do |row|
  # ... now I can use: row['column_name']
end
0
ответ дан sfogle 19 August 2018 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: