2013-08-03 2 views
0

우리는 CSV 파일을 가지고 있습니다. 특정 열에는 많은 항목이 있었으며 그 항목은 개행 문자 "\n"으로 분리되어야했습니다. 이는 발생하지 않았습니다. 영향을받은 열의 샘플 데이터는 다음과 같습니다.루비 정규 표현식으로 문자열 분할

30 units - R135     50 units - R225     80 units - R360 

세 개의 열로 나누는 방법이 있습니까? 열 수는 고정되어 있지 않습니다. 우리가 split 항목에 많은 공백 문자 (두 개 이상)를 사용해야 할 것입니다. 필요 :

data = "that long string" 
# Some operation 
result = ["30 units - R135", "50 units - R225", "80 units - R360"] 

나는 이런 식으로 시도했다. 그러나 그것은 효과가 없었습니다. 결과는 동일한 문자열입니다.

a.split('/(\s){3,}/') 

데이터를 분할하기 위해 어떤 방법을 사용할 수 있습니까?

+2

그것은 나를 위해 작동해야합니다. 내 생각 엔 루비가 정규 표현식을 리터럴 문자열로 해석하고 있다는 것입니다. 대신 a.split (/ (\ s) {3,} /)을 시도하십시오. – Jeremy

+2

'그 긴 문자열'에서 그 결과를 얻을 수 없다. 실제 입력 및 출력을 보여주십시오. 사람들은 귀하의 데이터가 어떻게 생겼는지 추측하지 않습니다. –

+2

물론 그것은 개행 문자가 없었습니다. 이것은 일반적으로 csv의 레코드 문자의 끝입니다. 데이터에 있다면 먼저 이스케이프 처리해야합니다. – DGM

답변

3

a.split('/(\s){3,}/') 

같은 문은 오에 a에서 문자열을 분할합니다 문자열/(\s){3,}/의 ccurrences (이는 놀랄 것도없이) 대상 문자열에 아무 것도 발생하지 않으므로 instact로 유지됩니다. 당신이 따옴표 없애과 문자 정규식 할 경우

당신은 출력

data = '30 units - R135     50 units - R225     80 units - R360' 

result = data.split /\s{3,}/ 

p result 

작성하여 정규 표현식을 지정

["30 units - R135", "50 units - R225", "80 units - R360"] 
2

이에 대한 올바른 정규식은 다음과 같습니다

a.split(/\s{3,}/)

정규식 표현 시험해 볼 수있는 좋은 장소 : http://rubular.com/ (:) 당신이 그것을 필요로하지 않을 수 있습니다,하지만 난 너무 많이 너무 사랑 나눔)

+2

OP는 * "두 개 이상의"* 공백 문자로 문자열을 분할하고 싶다고 말했습니다. 두 개는 둘 이상이 아니므로, 처음에는 패턴이 정확했습니다. – Borodin

+0

@Bododin, 죄송합니다. 질문을 잘못 읽고 그에 따라 답변을 업데이트했습니다. –

관련 문제