2013-08-15 2 views
3

큰 (> 150mb) 고정 폭 데이터 파일의 모음을 분석 중입니다. 필자는 100 줄 덩어리 (각 줄은 7385 자)에서 read.fwf()를 사용하여 천천히 읽었으며 추가 조작을 위해 관계형 데이터베이스로 밀어 넣었습니다. 문제는 텍스트 파일이 때로는 워키 멀티 바이트 문자를 가지고 있다는 것입니다 (예를 들어, "U"대신에 짜증나게 할 정도로 자주), 데이터 파일은 유니 코드 U + F8FF에 시스템이 할당 한 것이 있습니다. 사과 심볼이지만 크로스 플랫폼 표준인지 확실하지 않음). 단어 "카운티"의 후반 했어야텍스트 파일에서 1 바이트 ascii 강제 변환

invalid multibyte string at 'NTY <20> MAINE
000008 [...]

을하지만, 흔들 흔들, 상술 한 바와 같이, U이었다 : 그렇게되면, 나는 오류 다음과 같이 얻을. 누구나 유용하다고 생각하면 더 자세한 코드 & 데이터를 제공하십시오.

저는 R로 코딩을 모두하고 싶습니다. 1 바이트를 강요하는 방법을 모르겠습니다. 따라서 내 질문의 제목 라인 부분 : 거기에 몇 가지 잘못된 멀티 바이트 문자가있는 텍스트 파일에서 단일 바이트 ascii 강제로 쉬운 방법 있는가?

아마도이 문제를 해결할 더 좋은 방법이 있습니다 (시스템 레벨에서 grep을 사용하여 잘못된 멀티 바이트 문자를 사냥해야합니다)?

많은 도움을 주셨습니다.

+1

U + F8FF는 사실 플랫폼을 넘지 않도록 설계되었습니다. 그것은 _Private Use_로 명시 적으로 지정된 범위에 있습니다. – MSalters

+0

예! 텍스트 파일에서 이러한 종류의 문자를 제거하는 (또는 바꾸는) 방법을 알고 있습니까? 바이트 단위 검색을 수행하고 대체해야합니까? – Don

+1

'iconv -c -f UTF-8 -t ASCII'는 멀티 바이트 시퀀스가 ​​실제로 UTF-8이라고 가정하고 트릭을 수행해야합니다. Else'-f ISO-8859-1'가 작동 할 수도 있습니다. – MSalters

답변

2

데이터 파일에 대한 file 명령의 출력 내용은 무엇이라고 말합니까?

/tmp >file a.txt b.txt 
a.txt: UTF-8 Unicode text, with LF, NEL line terminators 
b.txt: ASCII text, with LF, NEL line terminators 

당신은/변환 iconv을 사용하여 파일의 내용을 음역 시도 할 수 있습니다.

# \x{93} and \x{94} are Windows 1252 quotes 
/tmp >perl -E'say "He said, \x{93}hello!\x{94}"' > a.txt 
/tmp >file a.txt 
a.txt: Non-ISO extended-ASCII text 
/tmp >cat a.txt 
He said, ?hello!? 

지금, 당신은 아스키로 변환을 시도 할 수의 iconv로 :

/tmp >iconv -f windows-1252 -t ascii a.txt 
He said, 
iconv: a.txt:1:9: cannot convert 

실패 여기에는 직접 변환이 없기 때문에 예를 들어, the Windows 1252 encoding을 사용하는 파일을 제공.

/tmp >iconv -f windows-1252 -t ascii//TRANSLIT a.txt > converted.txt 
/tmp >file converted.txt 
converted.txt: ASCII text 
/tmp >cat converted.txt 
He said, "hello!" 

이 사용 R의 IO 층을 할 수있는 방법이있을 수 있습니다,하지만 난 할 수 R.

희망을 모르는 대신, 당신은 음역을 할 iconv을 알 수 있습니다.

+0

다음은 오류가 발생하는 파일 중 하나입니다. KCRETA1978.DAT : CRLF 줄 종결 자로 구성된 매우 긴 행의 ASCII 텍스트 – Don

+0

ascii에서 변환하려고하면 iconv가 다음과 같이 말합니다. "acii에서 변환이 지원되지 않습니다. " 한숨. 제안 주셔서 감사합니다, 그래도! – Don

+1

@Don : "ASCII에서 변환"은 사실 ASCII 인 경우에만 작동하기 때문일 수 있습니다. ASCII는'U + 0000'에서'U + 007F'까지 실행됩니다. 인식 할 수없는 문자를 삭제하여 _to_ ASCII로 변환하려고합니다. 그것은'iconv -c'로 끝났습니다. – MSalters

관련 문제