2016-09-21 1 views
0

Ich arbeite an einer Codierungsaufgabe und versuche, meine Daten zu sortieren.CSV analysieren, konvertieren und als Array in Ruby sortieren

Die Herausforderung besteht darin:

  1. die Daten analysieren und nur die Zeilen finden, wo Benutzer vor 9/6/10 gestartet.
  2. Bestellen Sie die "start_dates" in aufsteigender Reihenfolge.
  3. Zurückgeben/Drucken Sie den resultierenden Ausdruck aus der Spalte "Wörter".

Ich bin in der Lage, die richtigen Worte zu bekommen, aber nicht in der richtigen Reihenfolge.

Die start_dates müssen in aufsteigender Reihenfolge sortiert werden, damit die Wörter in der richtigen Reihenfolge angezeigt werden.

Hier ist mein Code:

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 

Hinweis:1283731200 ist der Unix-Zeitstempel für das Datum ich brauche.

Wie kann ich row[13] sortieren? Jede Kombination der Sortiermethode, aber wieder einen dieser Fehler:

nicht definierte Methode 'Art' für 0: Fixnum (NoMethodError)

nicht definierte Methode 'Art' für "start_date": String (NoMethodError)

CSV-Schnipsel:

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

Können Sie ein kleines Beispiel der CSV-Datei bereitstellen? damit wir wissen, woran wir arbeiten mit – davidhu2000

+0

gerne, aber wie? Ich möchte keine Pasta mit ein paar zufälligen Texten kopieren. –

+0

nur ein paar Rows tun. – davidhu2000

Antwort

0

also, ich das Startdatum der ersten beiden Reihen modifiziert, so dass sie in der Zeit restricti fallen auf.

Als Referenz ist hier die CSV-Datei, die ich verwendet habe.

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,�_��_ۑ�Ӓ�ʑ�� 

Ein paar Probleme mit Ihrem Code

1) Sie erklären words = [] innerhalb der foreach Schleife, so dass es jedes Mal zurücksetzt. Das willst du nicht.

2) Sie verfolgen nicht das Startdatum für jeden der Werte, die Sie in das words Array schieben.

3) Die erste Zeile der CSV-Datei sind Überschriften, die Sie in Ihrem Code nicht berücksichtigen.

Hier ist, was ich tat

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"] 

ich einen Hash in diesem Fall verwendet. Sie haben also ein Schlüssel-Wert-Paar von starting_date => word.

Die Zeile next if row[0] == 'id prüft, ob wir in der ersten Zeile stehen. Wenn ja, springen Sie zur nächsten Iteration.

Dann wird die letzte Zeile, sortiere ich die Raute, die eine Anordnung in Form von [[starting_date1, word1], [starting_date2, word2]...] zurück, und ich verwende map die letzten Werte auszuwählen, die die Worte sind Sie wollen, so dass Sie am Ende mit einer Reihe von Wörter in aufsteigender Reihenfolge nach Anfangsdatum.

+0

Awesome - Ich denke, dass die Hash-Idee in diesem Fall einen Sinn ergeben hat. Das hat für mich funktioniert. Das einzige, was ich änderte, war das Entfernen der Zeile "next if row [0] == 'id''. Stattdessen habe ich 'CSV.foreach (csvFile, headers: true)' hinzugefügt Danke! –