2

いくつかの列を持つ「マスター」ファイルがあります:1 2 3 4 5.他にいくつかのファイルがあり、マスターファイルよりも行数が少なく、それぞれに列があります:16.これらのファイルを一致させてマージします列1フィールドで、列6をマスターに追加します。私はいくつかのpython/UNIXソリューションを見てきましたが、それが適切である場合はruby/fastercsvを使用したいと思います。始めに助けていただければ幸いです。

4

3 に答える 3

2

FasterCSVは、Ruby1.9のデフォルトのCSV実装になりました。このコードはテストされていませんが、機能するはずです。

require 'csv'
master = CSV.read('master.csv') # Reads in master
master.each {|each| each.push('')} # Adds another column to all rows
Dir.glob('*.csv').each do |each| #Goes thru all csv files
  next if each == 'master.csv' # skips the master csv file
  file = CSV.read(each) # Reads in each one
  file.each do |line| #Goes thru each line of the file
    temp = master.assoc(line[0]) # Finds the appropriate line in master
    temp[-1] = line[1] if temp #updates last column if line is found
  end
end

csv = CSV.open('output.csv','wb') #opens output csv file for writing
master.each {|each| csv << each} #Goes thru modified master and saves it to file
于 2011-10-30T20:18:46.260 に答える
1
$ cat j4.csv
how, now, brown, cow, f1
now, is, the, time, f2
one, two, three, four, five
xhow, now, brown, cow, f1
xnow, is, the, time, f2
xone, two, three, four, five
$ cat j4a.csv
how, b
one, d
$ cat hj.rb
require 'pp'
require 'rubygems'
require 'fastercsv'

pp(
  FasterCSV.read('j4a.csv').inject(
    FasterCSV.read('j4.csv').inject({}) do |m, e|
      m[e[0]] = e
      m
    end) do |m, e|
    k = e[0]
    m[k] << e.last if m[k]
    m
  end.values)
$ ruby hj.rb
[["now", " is", " the", " time", " f2"],
 ["xhow", " now", " brown", " cow", " f1"],
 ["xone", " two", " three", " four", " five"],
 ["how", " now", " brown", " cow", " f1", " b"],
 ["one", " two", " three", " four", " five", " d"],
 ["xnow", " is", " the", " time", " f2"]]

これは、マスターファイルを列1をキーとしてハッシュにマッピングし、他のファイルからキーを検索することで機能します。書かれているように、コードはキーが一致したときに最後の列を追加します。マスター以外のファイルが複数あるため、各ファイルを読み取り、それらすべてを単一の配列配列に連結するメソッドに置き換えることで概念を適応させるか、内部(マスターハッシュ)FasterCSV.read('j4a.csv')から結果を保存することができます。inject)そしてループでお互いのファイルをそれに適用します。

于 2011-10-30T19:49:40.917 に答える
0
temp = master.assoc(line[0]) 

上記は非常に遅いプロセスです。複合体全体は少なくともO(n ^ 2)です。

私は以下のプロセスを使用します:

  1. 1 6 csvの場合、1をキー、6を値として、1_to_6_hashという名前の大きなハッシュに変換します。
  2. ループ123 4 5 csv行ごとに、row [6] = 1_to_6_hash[row[1]]を設定します

複合体をO(n)に劇的に減らします

于 2018-09-08T14:53:40.450 に答える