2012-10-16 2 views
1

내 컴퓨터에는이 문자가 무엇인지 알 수 없습니다. Excel에서 왔습니다.루비의 CSV에서 특수 문자를 생성 한이 악명 높은 악보를 필사적으로 제거하려고 시도했습니다.

에서 그것은 이상한 공간이었습니다. 이제 문자 그대로 여러 기호로 표현됩니다. 내 컴퓨터는 그것이 무엇인지 전혀 모른다.

이 문자는 엑셀로 표시됩니다 (csv에서는 xls과 같은 종류의 공백 임). OS X의 TextEdit은 이것을 긴 공간으로 처리합니다. " 입니다. 루비의 CSV 파서는 일반 utf-8을 사용하여 파싱을 시도 할 때 파열되며, 구문 분석을 위해 :encoding => "windows-1251:utf-8"을 추가해야합니다.이 경우 Ruby는이를 "K"로 바꿉니다. 이 K는 내 CSV에서 9, 12, 15 및 18 그룹 (KKKKKKKKKK 등)으로 표시되며 gsub(/K/)을 통해을 (를) 제거 할 수 없습니다 (K 그룹,/KKKKKKKKK/등은 제거 할 수 없습니다). 나는 또한 opensource 도구 CSVfix을 사용했지만 "선행 및 후행 공백 제거"명령은 K에 영향을주지 않았습니다.

내가 Remove non-ascii characters from csv에 제안 sed를 사용했지만,

나오지

같은 오류를 가지고 : 1 : "output.csv"

오 잘못된 명령 코드는 sed -i 's/[\d128-\d255]//' input.csv 뭔가를 실행하는 경우 Mac에서.

+0

나는이 문자에 "no"/ replace-with-nothing이라고 말하는 루비를 얻는 방법을 원하고 완전히 처음부터 무시합니다. –

+0

ASCII가 아닌 텍스트는 사용할 수 없지만 ASCII-8BIT를 사용하여 Ruby로 텍스트를 열어 보았습니다. 그런 식으로 사악한 문자를 찾아서 바꾸시겠습니까? –

+0

요즘 빌 중 하나는 질문을 삭제하겠습니다. –

답변

0

대답을 제거하려면 다음과 같이 당신의 CSV를 구문 분석하는 것은이 매우 어려운 문제이다)

A.입니다. 아무도 지금까지 "신체적으로"어떻게 키릴 자모 Ks를 제거합니다.

하지만

B.) CSV 파일은 너무 긴 인코딩 프로그램을 중단하지 않는 한 찾을 작품 정규식을 사용하여 이렇게 일치하는 문자열을 이스케이프 쉼표로 구분 단지 문자열입니다.

그래서 파일을 다음

f = File.open(File.join(Rails.root, 'lib', 'assets', 'repo', name), :encoding => "windows-1251:utf-8") 
parsed = CSV.parse(f) 

정규 표현식 리터럴 문자열 매칭을 통해 특정 행 (는 키릴 K의 간과 것)

parsed.each do |p|   #here, p[0] is the metatag column 
    @specific_metatag_row = parsed.index if p[0] =~ /MetatagA/ 
end 
0

** 자동 응답 (다른 계정, 같은 사람)

1 솔루션을 시도 :

evil_string_from_csv_cell = "KKKKKKKKK" 
encoding_opts = { 
    :invalid => :replace, :undef => :replace, 
    :replace => '', :universal_newline => true } 
evil_string_from_csv_cell.encode Encoding.find('ASCII'), encoding_opts 
#=> "" 

2 솔루션을 시도 :

'사용하지 마십시오 창-1251 : UTF- 8 '인코딩 사용'ISO-8859-1 '대신에, 그 (키릴)의 K로 설정한다 "다음

string.gsub!(/\xCA/, '') 
제거 할 수 \ XCA를' 0

** 아직이 문제를 해결하지 못했습니다.

3 솔루션을 시도 :

은 K의이 어리석은 실제 있었다 같은 경우 K의 배열과 일치하려고합니다. 그 문자를 여기 works-- 방법과 실제 키릴 K 복사 및 붙여 넣기

К

루비가 정상 K의

보다 조금 대담을하여 취급 끝에 작은 컬을 통지 참조

4 솔루션/전략 시도 (성공) : 당신은 그 사용을 무시할 수 있습니다, 뭔가에

  • 사용 정규 표현식은 너무 오래 당신이 이상한 공간을 인코딩 할 수 있습니다로, 문자를 캡처 (또는 그들이 무엇이든) 정규 표현식
  • 도 문서 유형 중 임의의 공간적 (매트릭스와 같은) 패턴을 활용하려고합니다.
+0

이 문자의 정식 명칭은 "U + 041A" –

+0

"U + FFD0" –

+0

다른 종 ('iso-8859-1'을 사용하는 경우) : "\ xCA" –

0

가이 문제에 "악"문자를

.encode!("ISO-8859-1", :invalid => :replace) 
+0

작동하지 않습니다. 실제로 12 일까지 내 인생을 단축했기 때문에 나는 실제로이 문제를보고있다. –

+0

그리고 너는 3 일만 보냈다. –

+0

나는 루비에서 강력하다는 데 익숙하다. 이것은 매우 스트레스가 많다. issue --- btw, 다시, 나는이 문제를 더 이상 보지 말고 파트너가 처리 할 것이라고 파트너에게 말했지만 오류는 utf-8이나 다른 것으로 변환되는 것과 관련이있다. "잘못된 비트 오류 "또는 뭔가 그런, 그래서 일종의 이진 비호 환성 문제 –

0

내가 작업 sed를 얻을 수 있지만, 결국 없습니다를 찾을 수를 읽어 Vim에서 행운을 빌어 요 :

vim myhorriblefile.csv 

# Once vim is open: 
:s/Ê/ /g 
:wq 

# Done! 

일반적인 기능

clean_weird_character() { 
    vim "$1" -c ":%s/Ê/ /g" -c "wq" 
} 
관련 문제