2016-09-21 5 views
0

코딩 문제로 작업 중이며 데이터를 정렬하려고했습니다.Ruby에서 CSV, 변환 및 배열로 배열을 배열하십시오.

  1. 데이터를 구문 분석하고 사용자가 9/6/10 전에 시작된 경우에만 행을 찾을 수 :

    도전이다.

  2. "시작일"을 오름차순으로 정렬하십시오.
  3. 결과 단어를 "단어"열에서 반환하거나 인쇄하십시오.

올바른 단어를 얻을 수는 있지만 올바른 순서는 아닙니다.

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 내가해야 할 일에 대한 유닉스 타임 스탬프입니다

여기 내 코드입니다.

row[13]은 어떻게 정렬 할 수 있습니까? 정렬 방법의 모든 조합,하지만 다시 이러한 오류 중 하나가 얻을 :

정의되지 않은 메서드 0 '종류'Fixnum이라는 (NoMethodError)

정의되지 않은 메서드 "시작일"에 대한 '일종의': 문자열 (NoMethodError을)

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,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

단지 몇 개의 riow가 할 것이다. – davidhu2000

답변

0

, 나는 그들은 시간 restricti 내부의 처음 두 행의 시작 날짜를 가을 수정 된 있도록 에.

참고로 여기에 사용한 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) '를 추가했습니다. 고마워요! –