2016-09-21 10 views
0

私はコーディングの課題を抱えており、データを並べ替えることを試みている。RubyでCSV、変換、および配列としての並べ替えを行う

  1. データを解析し、ユーザーは9/6/10の前に開始した行だけを見つける:

    挑戦はです。

  2. "start_dates"を昇順に並べ替えます。
  3. "words"列から結果のフレーズを返します。

正しい単語を取得できますが、正しい順序ではありません。

start_datesを昇順にソートする必要があります。これにより、単語が正しい順序で表示されます。

require 'CSV' 

csvFile = 'tse.csv' 

CSV.foreach(csvFile) do |row| 
    int = row[13].to_i 
    words = [] 
    if int < 1283731200 
    words.push(row[16]) 
    end 
    puts words 
end 

注:1283731200は私が必要とする日付のUnixのタイムスタンプである

は、ここに私のコードです。

どのように並べ替えることができますrow[13]?ソート方法のあらゆる組み合わせが、戻ってこれらのいずれかのエラーを取得:

未定義のメソッド0は「ソート」:Fixnumか(NoMethodError)

未定義のメソッド「START_DATE」のための「ソート」:文字列(NoMethodErrorを)

CSVスニペット:彼らは時間restrictiの内側に収まるようにそう

id,created_at,first_name,last_name,email,gender,company,currency,drug_brand,drug_name,drug_company,pill_color,frequency,start_date,end_date,other,words,bitcoin,word 
676,1351140260,Charles,Rice,[email protected],Male,Realbuzz,MDL,Nortriptyline Hydrochloride,Nortriptyline Hydrochloride,"Physicians Total Care, inc.",Maroon,monthly,1409564900,1331661153,Monthly,aliquet,1AeYC1Cc49p7J5hFqUcsgJFjXb5Pqa68AQ,",./;'[]\-=" 
2002,1540878657,Margaret,Day,[email protected],Female,Devbug,IDR,RENOKIN HAIR REVITALIZING CONDITIONER,Dimethicone,"Caregen Co., Ltd.",Yellow,monthly,1458457018,1533561260,Weekly,cursus,164X1tNoUguVA8Xpg2vnp3cfYzhTRGxwoN,<svg><script>0<1>alert('XSS')</script> 
3324,1589084473,Anthony,Collins,[email protected],Male,Avamm,EUR,FRUITOPIA,PYRITHIONE ZINC,CVS PHARMACY,Blue,weekly,1333192422,1520700521,Never,pharetra,15oqV5seTTsQZDJhagJoU2z5hB9m7QCRAj,�_��_ۑ�Ӓ�ʑ�� 
+0

あなたはcsvファイルの小さなサンプルを提供できますか?だから我々は – davidhu2000

+0

と一緒に働いていることを喜んで知っているが、どうやって?パスタをランダムなテキストの束にコピーしたくない。 –

+0

ちょうどいくつかの騒ぎがします。 – davidhu2000

答えて

0

、私は最初の2行の開始日を変更しましたに。

参考までに、私が使用したcsvファイルを参考にしてください。

id,created_at,first_name,last_name,email,gender,company,currency,drug_brand,drug_name,drug_company,pill_color,frequency,start_date,end_date,other,words,bitcoin,word 
676,1351140260,Charles,Rice,[email protected],Male,Realbuzz,MDL,Nortriptyline Hydrochloride,Nortriptyline Hydrochloride,"Physicians Total Care, inc.",Maroon,monthly,1209564900,1331661153,Monthly,aliquet,1AeYC1Cc49p7J5hFqUcsgJFjXb5Pqa68AQ,",./;'[]\-=" 
2002,1540878657,Margaret,Day,[email protected],Female,Devbug,IDR,RENOKIN HAIR REVITALIZING CONDITIONER,Dimethicone,"Caregen Co., Ltd.",Yellow,monthly,1158457018,1533561260,Weekly,cursus,164X1tNoUguVA8Xpg2vnp3cfYzhTRGxwoN,<svg><script>0<1>alert('XSS')</script> 
3324,1589084473,Anthony,Collins,[email protected],Male,Avamm,EUR,FRUITOPIA,PYRITHIONE ZINC,CVS PHARMACY,Blue,weekly,1333192422,1520700521,Never,pharetra,15oqV5seTTsQZDJhagJoU2z5hB9m7QCRAj,�_��_ۑ�Ӓ�ʑ�� 

あなたのコード

1での問題のカップル)あなたはforeachループ内words = []を宣言し、それは毎回リセットされます。あなたはそれを望んでいません。

2)words配列にプッシュする各値の開始日を追跡しているわけではありません。

3)csvファイルの最初の行は見出しですが、コードではこれを考慮していません。

は、ここで私はこのケースでハッシュを使用し、私は

require 'csv' 

csvFile = 'test.csv' 
words = {} 
CSV.foreach(csvFile) do |row| 
    next if row[0] == 'id' 

    int = row[13].to_i 
    if int < 1283731200 
    words[row[13]] = row[16] 
    end 
end 
words = words.sort.map(&:last) #=> ["cursus", "aliquet"] 

やったことです。キー値ペアはstarting_date => wordです。

next if row[0] == 'idは、最初の行にあるかどうかを確認します。その場合は、次の反復にスキップします。

最後の行は、[[starting_date1, word1], [starting_date2, word2]...]の形式で配列を返すハッシュをソートし、最後の値を選択するのにmapを使用して、最終的な値を選択します。開始日までに昇順に並べ替えられます。

+0

驚くばかり - この場合、ハッシュの考え方は低いと思います。これは私のために働いた。 私が変更したのは 'next if row [0] == 'id''行を削除することだけでした。 代わりに 'CSV.foreach(csvFile、headers:true) 'を追加しました ありがとう! –

関連する問題