2014-02-08 3 views
0

첫 번째 예제처럼 보이는 줄이 많은 텍스트 파일이 있는데 두 번째 줄만 보이는 텍스트 파일이 있습니다 (주의 사항 **는 필자가 사용한 필드를 보여주기위한 것입니다. m 후에, 그들은 실제 파일에서 이렇게 보이지 않는다.);Ruby 텍스트 파일 구문 분석 방법은

22034 BUBBA C BC-022 **OWL SOFTIE** <N/A> <N/A> <N/A> 470 0.00 **6** 0.00 **1** **37.95** 

22489 BUBBA C BC- **BUNNY BOO BOO** <N/A> <N/A> <N/A> 470 0.00 **2** 0.00 **1** **24.95** 

내 목표는 형식으로 ** 둘러싸인 필드를 추출하는 것입니다 (아마 CSV) 그래서 기존의 Excel 스프레드 시트에 시트로 추가 할 수 있습니다.

내 문제는 내가 등 내가 GSUB를 사용하여 필요한 데이터 만, 분할, TR, 스캔, 경기를 추출하는 방법을 알아낼 수 없습니다입니다

내 초기 생각 나는 각 줄을 구문 분석, 나는이 좋겠했다 (코드를 찾을 수없는) 공간의 네 번째 인스턴스까지 삭제 한 다음 첫 번째 <과 마지막 사이의 모든 것을 삭제하거나 건너 뛴 다음 다음 2 개의 필드를 삭제하고 삭제하고 1을 유지하고 다음을 삭제합니다. 나머지를 유지하십시오.

모든 것이 최종 결과에 도달하는 피로 어려운 방법 같습니다.

정확한 코드로이 문제를 해결하고 싶지는 않습니다.이 유형의 문제를보고있을 때 사용할 방법과 사용하려는 도구에 대해 더 자세히 설명합니다. (스트립, gsub 등)

어떤 도움을 크게 감사하겠습니다.

답변

2

사용 #split/#join 쌍 진행 :

a='22034 BUBBA C BC-022 **OWL SOFTIE** <N/A> <N/A> <N/A> 470 0.00 **6** 0.00 **1** **37.95**'.split 
[ a[4..-10].join(' '), a[-4], a[-2], a[-1] ].join ' ' 
# => "**OWL SOFTIE** **6** **1** **37.95**" 
+0

완벽 함, 가장 단순한 것처럼이 항목과 함께했습니다. – gorlaz

1

공백으로 구분 된 파일입니까? 그건 ... 최적의 형식이 아닙니다.

어쨌든, 그 **OWL SOFTIE** 필드

[7] pry(main)> m = s.match /BC-\d*\s(.*?)\s</ 
=> #<MatchData "BC-022 OWL SOFTIE <" 1:"OWL SOFTIE"> 

[8] pry(main)> m.captures[0] 
=> "OWL SOFTIE" 

을하다가 정규식을 사용하고 split은 다른 모든 것들을 잡아. 전부

[11] pry(main)> arr = s.split[-4..-1] 
=> ["6", "0.00", "1", "37.95"] 
[12] pry(main)> arr.select.with_index {|x,i| i!=1 } 
=> ["6", "1", "37.95"] 

:

[13] pry(main)> [s.match(/BC-\d*\s(.*?)\s</).captures[0]] + s.split[-4..-1].select.with_index {|x,i| i!=1 } 
=> ["OWL SOFTIE", "6", "1", "37.95"] 

당신 만이

+0

감사 roippi! – gorlaz

1

(당신은 무엇이든지 그 입력 파일에 대한 제어가 있다면 당신이 그것을 공백이 아닌 다른 :)으로 구분 할 수있는 경우, 참조) 다양한 단어가 포함 된 하나의 복잡한 필드가 분할로 시작됩니다.

a = "22034 BUBBA C BC-022 OWL SOFTIE <N/A> <N/A> <N/A> 470 0.00 6 0.00 1 37.95".split 

그런 다음 p 떨어져을 ICK :

[a[4..-10].join(' '), a[-4], a[-2], a[-1]] 
+0

감사합니다. seph, good also;) – gorlaz