2010-12-13 6 views
0

Rubyに比較的新しいので、私はFasterCSVを使用して以下を行う方法を見つけようとしています: CSVファイルを開き、ヘッダーで列を選択します。ストリングxがyで出現した場合は、新しいファイルをSTDOUTに書き出します。 次のコードはほとんど動作します:FasterCSVを使用して1つのCSV列のテキストを置換する

filename = ARGV[0] 
csv = FCSV.read(filename, :headers => true, :header_converters => :symbol, :return_headers => true, :encoding => 'u') 
mycol = csv[:mycol] 
# construct a mycol_new by iterating over mycol and doing some string replacement 
puts csv[:mycol][0] # produces "MyCol" as expected 
puts mycol_new[0] # produces "MyCol" as expected 
csv[:mycol] = mycol_new 
puts csv[:mycol][0] # produces "mycol" while "MyCol" is expected 
csv.each do |r| 
    puts r.to_csv(:force_quotes => true) 
end 

唯一の問題は、私はそれを期待していないヘッダ変換があるということです。選択した列のヘッダーがcsv表の列の置換前に "MyCol"である場合は、後で "mycol"になります(コードのコメントを参照)。なぜこれが起こるのですか?それを避ける方法は?ありがとう。

答えて

4

初期化行で変更できることがいくつかあります。変更:

csv = FCSV.read(filename, :headers => true, :return_headers => true, :encoding => 'u') 

に:私はそれがRuby 1.9のの一部ですFasterCSVあるCSVを、使用してい

csv = FCSV.read(filename, :headers => true, :encoding => 'u') 

。これは修正「します。FName」フィールドと「temp.csv」と呼ばれる、現在のディレクトリにCSVファイルを作成します。

require 'csv' 

data = "ID,FName,LName\n1,mickey,mouse\n2,minnie,mouse\n3,donald,duck\n" 

# read and parse the data 
csv_in = CSV.new(data, :headers => true) 

# open the temp file 
CSV.open('./temp.csv', 'w') do |csv_out| 

    # output the headers embedded in the object, then rewind to the start of the list 
    csv_out << csv_in.first.headers 
    csv_in.rewind 

    # loop over the rows 
    csv_in.each do |row| 

    # munge the first name 
    if (row['FName']['mi']) 
     row['FName'] = row['FName'][1 .. -1] << '-' << row['FName'][0] << 'ay' 
    end 

    # output the record 
    csv_out << row.fields 
    end 
end 

出力は次のようになります。

ID,FName,LName 
1,ickey-may,mouse 
2,innie-may,mouse 
3,donald,duck 
+0

ありがとうございました。あなたが書いているように、新しい列を作成し、既存の列を新しい列に置き換えるのではなく、選択した列を直接操作することです(下記のコードを参照)。 – Stefan

3

希望を操作することが可能です新しい列を作成して古い列を新しい列に置き換えるのではなく、FasterCSVオブジェクトの列を直接使用することができます。

関連する問題