2011-10-25 2 views
0

형식이 잘못된 .csv 파일에 여분의 큰 따옴표가있는 데이터 행이 있습니다 (예 : 마지막 줄 :여분의 큰 따옴표를 제거하는 방법은 무엇입니까?

Name,Comment 
"Peter","Nice singer" 
"Paul","Love "folk" songs" 

내가 문자열을 folk 주위에 따옴표를 제거하고 대체 할 수있는 방법 등 :

Name,Comment 
"Peter","Nice singer" 
"Paul","Love _folk_ songs" 

답변

1
$str = '"folk"'; 

$new = str_replace('"', '', $str); 

/* now $new is only folk, without " */ 
+1

하, 하, 매우 재밌어요 :) –

+4

유머에 대해 투표를해야할지, 아니면 실종에 해당하는지 결정할 수 없습니다. –

+0

글쎄, 그는 그 질문에 정확하게 대답했다. –

8

루비 1.9, 다음 작품에서 :

result = subject.gsub(/(?<!^|,)"(?!,|$)/, '_') 

이전 버전에는 lookbehind 어설 션이 없습니다.

설명 : 물론

(?<!^|,) # Assert that we're not at the start of the line or right after a comma 
"   # Match a quote 
(?!,|$) # Assert that we're not at the end of the line or right before a comma 

이것은 우리가 루비 1.9에없는 경우

"Mary",""Oh," she said" 
+0

그의 다른 질문 (http://stackoverflow.com/questions/7886051/)을 기반으로, 나는 병리학 적 사례의 가능성이 상당히 높다고 말할 수 있습니다. –

+0

ruby ​​1.8.7 버전이 있습니까? 감사! – ohho

+0

아니요, Ruby 버전 <1.9에서 해당 기능이 누락 되었기 때문입니다. –

2

같은 병적 인 경우에 실행하거나 피곤하지 않을 것이라는 가정 정규 표현식을 사용하는 경우 ,에 문자열을 분할하고 첫 번째/마지막 인용 부호를 제거하고 "_으로 대체하고 다시 인용하고 ,과 결합하십시오.

(우리는하지 않습니다 항상 효율성에 대해 걱정할 필요가!)

+0

예, "Peter, Paul and Mary", "Puff, the Magic Dragon"이 나타납니다. –

+0

@TimPietzcker (예, 루비의 CSV 라이브러리가이 권리를 처리 할 것인지 기억하려고하는 내부 투쟁이있었습니다. 마침내 그것 모두에 punted.) –

+1

'fastercsv'이 (적어도 기본 설정으로) 처리 할 수 ​​없다. – ohho

0

메타 전략 :

그것은 가능성이 데이터를 수동으로 일관성 입력 된 사건

, 사람들이 수동으로 입력 할 때 CSV의이 혼란스러워 필드 종료 자 (큰 따옴표) 또는 구분 기호 (쉼표)를 필드 자체에 추가하십시오. 파일을 재생성 할 수 있다면 5 개의 물결표 (~~~~~)와 같이 매우 드문 필드 시작/종료 표식을 사용하도록 요청한 다음 "~~~~~~~~~~"로 나눌 수 있습니다. "매번 올바른 필드 수를 얻으십시오.

0

다른 선택의 여지가없는 한 올바른 이스케이프 처리로 파일을 다시 생성하십시오. 이스케이프 처리되지 않은 따옴표를 삽입하면 손실이 발생하고 따라서 확실하게 되돌릴 수 없으므로 다른 방법으로 문제를 묻는 중입니다.

파일에서 소스를 가져올 수 없다면 Tim Pietzcker의 정규식은 아무것도 사용하지 않는 것보다 낫지 만 스크립트에서 모든 "고정 된"줄을 인쇄하고 수동으로 오류를 검사하도록하는 것이 좋습니다.

관련 문제