0

次のような垂直 CSV ファイルがあります。

name,value
case,"123Case0001"
custodian,"Doe_John"
PDate,"10/30/2013"

次のようにファイルを読み取ることができます。

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
ev_info = record[0]
ev_val = record[1]

問題は、特定ev_valの 1 つだけの特定を取得する必要があることev_infoです。行番号を使用できる可能性がありますが、先見の明から、これは変更される可能性があることがわかります。同じになるのは情報の名前です。特定の情報名を持つ行を見つけて、その値を取得したい。

を実行するforeachと、その値が取得され、それを過ぎて空の変数が残ります。これは、他の行に続いたためです。

誰でも助けることができますか?

4

3 に答える 3

2

多くの選択肢がありますが、最も簡単なのは、次のように、内容に基づいて変数に割り当てることです。

ev_info = record[0]
ev_val = record[1] if ev_info='special name'

ただし、ブロックの外側に割り当てる変数を定義する必要があることに注意してください。そうしないと、ローカル変数として作成され、後でアクセスできなくなります。

または、配列全体を読み取ってから、indexまたはで関心のあるレコードを選択することもできますselect

于 2013-10-30T15:34:46.790 に答える
1

私はそれを次のようにします:

require 'pp'
require 'csv'

ROWS_IN_RECORD = 4

data = []
File.open('test.dat', 'r') do |fi|
  loop do
    record = {}
    ROWS_IN_RECORD.times do
      row = fi.readline.parse_csv
      record[row.first] = row.last
    end
    data << record
    break if fi.eof?
  end
end

pp data

実行すると、次のように出力されます。

[{"name"=>"value",
  "case"=>"123Case0001",
  "custodian"=>"Doe_John",
  "PDate"=>"10/30/2013"},
 {"name"=>"value_2",
  "case"=>"123Case0001 2",
  "custodian"=>"Doe_John 2",
  "PDate"=>"10/30/2013 2"}]

ハッシュの配列を返すため、各ハッシュは、ファイルが通常の CSV ファイルである場合に通常 CSV から取得するレコードです。

入力ファイルを論理グループに分割する方法は他にもありますが、これはスケーラブルであり、マイナーな変更で巨大なデータ ファイルを処理できます。巨大なファイルの場合、data変数にプッシュするのではなく、ループの最後で各レコードを処理するだけです。

于 2013-10-30T16:36:50.687 に答える
1

私はそれを働かせました。私のオリジナルは次のとおりです。

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
    ev_info = record[0]
    c_val = record[1]
case when ev_info == "Custodian"
 cust = cval
  end
    end
puts cust

私がする必要があったのはこれでした:

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
    ev_info = record[0]
    case when ev_info == "Custodian"
    c_val = record[1]
  end
    end

puts c_val
于 2013-10-30T20:42:30.823 に答える