3

次のようなデータセットを取得しようとしています。

データのソース形式

そして、レコードを次の形式に変換します。

宛先フォーマット

結果のフォーマットには、古い列名用の列と値用の列の 2 つの列があります。10,000 行ある場合、新しい形式のデータのグループは 10,000 あるはずです。

私はすべての異なる方法、Excel の数式、SQL (mysql)、または直接の Ruby コードも使用できます。この問題に取り組む最善の方法は何ですか?

4

3 に答える 3

10

データの左側に ID 列を追加し、リバース ピボットテーブルメソッドを使用できます。

  • Alt+D+P を押して、次の手順でピボットテーブル ウィザードにアクセスします。

    1.  Multiple Consolidation Ranges
    2a. I will create the page fields
    2b. Range: eg. sheet1!A1:A4 
        How Many Page Fields: 0
    3.  Existing Worksheet: H1
    
  • ピボットテーブルで:

    Uncheck Row and Column from the Field List
    Double-Click the Grand Total as shown
    

ここに画像の説明を入力

于 2012-07-26T19:11:05.500 に答える
1

楽しみのために:

# Input file format is tab separated values

# name  search_term address code
# Jim jim jim_address 123
# Bob bob bob_address 124
# Lisa  lisa  lisa_address  126
# Mona  mona  mona_address  129


infile = File.open("inputfile.tsv")

headers = infile.readline.strip.split("\t")
puts headers.inspect
of = File.new("outputfile.tsv","w")
infile.each_line do |line|
  row = line.split("\t")
  headers.each_with_index do |key, index|
    of.puts "#{key}\t#{row[index]}"
  end
end

of.close



# A nicer way, on my machine it does 1.6M rows in about 17 sec

File.open("inputfile.tsv") do | in_file |
  headers = in_file.readline.strip.split("\t")
  File.open("outputfile.tsv","w") do | out_file |
    in_file.each_line do | line |
      row = line.split("\t")
      headers.each_with_index do | key, index | 
        out_file << key << "\t" << row[index]
      end
    end 
  end
end
于 2012-07-26T19:40:21.177 に答える
0
destination = File.open(dir, 'a') do |d|   #choose the destination file and open it

    source = File.open(dir , 'r+') do |s|  #choose the source file and open it
      headers = s.readline.strip.split("\t")  #grab the first row of the source file to use as headers
      s.each do |line| #interate over each line from the source

        currentLine = line.strip.split("\t") #create an array from the current line
           count = 0   #track the count of each array index
        currentLine.each do |c| #iterate over each cell of the currentline
              finalNewLine = '"' + "#{headers[count]}" + '"' + "\t" + '"' + "#{currentLine[count]}" + '"' + "\n" #build each new line as one big string
          d.write(finalNewLine) #write final line to the destination file.
          count += 1 #increment the count to work on the next cell in the line
        end

      end
  end

end
于 2012-07-26T19:59:16.340 に答える