2013-10-30 6 views
1

Ruby를 사용하여 CSV 파일에서 특정 데이터를 추출하고 있으며 원하지 않는 문자를 제거하여 추출 된 문자열을 정리하려고합니다.CSV 파일에서 추출한 문자열을 정리하십시오.

지금까지 데이터를 추출하는 방법이 있습니다 :

다음
CSV.foreach(data_file, :encoding => 'windows-1251:utf-8', :headers => true) do |row| 

    #create an array for each page 
    page_data = [] 
    #For each page, get the data we are interested in and save it to the page_data 
    page_data.push(row['dID']) 
    page_data.push(row['xTerm']) 

    pages_to_import.push(page_data) 

I 출력 추출 된 데이터

는 CSV 데이터 파일을 그대로 추출 출력은 정확히로 csv 파일 :

| ID | Term         | 
|-------|-----------------------------------------| 
| 13241 | @@106#107#[email protected]@106#[email protected]@   | 
| 13345 | @@63#[email protected]@       | 
| 11436 | @@55#[email protected]@20#[email protected]@10015#18#[email protected]@ | 

그러나, 나는이 달성하고자하는 내 원하는 결과는 다음과 같습니다

| ID | Term         | 
|-------|-----------------------------------------| 
| 13241 | my, term        | 
| 13345 | hello         | 
| 11436 | rock, my, world      | 

어떻게해야합니까? 임 사용

라이브러리 : 나는 당신의 기간이 bookended하게 분리 @@에 의해 #에 의해 분리 된 실제 기간 뒤에 하나 개 이상의 숫자로 구성되어 있으리라 믿고있어

require 'nokogiri' 
require 'cgi' 
require 'csv' 
+0

regexp가 문제를 해결하기 좋은 후보인 것 같습니다. –

+0

시도해 보셨습니까? 그것은 우리에게 더 낫고, 우리가 당신에게 시도한 것을 보여주고, 무엇이 잘못되었는지 알려주고, 누군가가 당신이하고있는 것과 전혀 무관 한 무언가를 쓰는 대신 그것을 비틀 수 있습니다. 그것을 코드에 넣으려고합니다. –

+0

루비를 처음 사용하는 경우 정직하게 시작해야할지 모르겠다! –

답변

1

, 내가 할 줄 :

%w[ 
    @@106#107#[email protected]@106#[email protected]@ 
    @@63#[email protected]@ 
    @@55#[email protected]@20#[email protected]@10015#18#[email protected]@ 
    @@106#107#[email protected]@106#[email protected]@ 
    @@63#[email protected]@ 
    @@55#[email protected]@20#[email protected]@10015#18#[email protected]@ 
].map{ |str| 
    str.scan(/[^@#]+?)([email protected]/) 
} 
# => [["term1", "term2"], ["term1"], ["term1", "term2", "term3"], ["my", "term"], ["hello"], ["rock", "my", "world"]] 

strrow['xTerm']의 내용과 동일합니다. # 또는 @을 포함하고 @로 끝나지 않는 str의 패턴에 대한

정규 표현식 /[^@#]+?([email protected])/ 검색합니다.

문자열의 가비지와 Nokogiri 및 CSV를 사용하고 있다는 귀하의 의견에서 그리고 입력 한 데이터를 CSV 또는 HTML로 표시하지 않았기 때문에 들어오는 것을 mangling하지 않는지 궁금합니다. 어떻게 든 데이터를 수집하고 후 처리 과정에서 그 데이터를 흔들어 내려고합니다. 그렇다면 실제로 무엇을하고 있는지 보여 주시고 깨끗한 데이터를 시작할 수 있도록 도와주십시오.

+0

좋아요. 시도해 볼게요. –

+0

이게 무슨 뜻입니까? : 정의되지 않은 메소드'map ' –

+0

'.map'이 연결된 객체는 호출 된 메소드를 정의하지 않습니다. '지도'. –

0

.

row['xTerm'].split('@@')[1..-1].map { |term| term.split(?#)[-1] } 

그런 다음 수 join 또는 당신이 그것으로 원하는 건 뭐든지 할 : 배열로 용어를 얻으려면.

정규 표현식을 사용
+0

내 용어가 term1 및 term2 등으로 불리지 않지만 특정 단어 인 경우 어떻게해야합니까? 제발 새로운 버전을 만나십시오 –

+0

내 코드를 읽었습니까? ''term ''문자열과 아무런 관련이 없습니다. – Max

+0

괜찮아요 내가 전에 줄 게. –

관련 문제