2015-02-04 3 views
2

.gz 파일을 열고 압축 해제를 위해 청크로 읽습니다.문자열 캐스팅 후 문자열 레코드 구분 기호가 손실됩니다.

비 압축 파일의 데이터는 다음과 같습니다. aRSbRScRSd, 각 레코드 (내 더미 예제 a, b, c의 레코드) 사이에는 레코드 구분 기호 (ASCII 코드 30)가 있습니다.

File file = File(mylog.gz, "r"); 
    auto uc = new UnCompress(); 
    foreach (ubyte[] curChunk; file.byChunk(4096*1024)) 
    { 
     auto uncompressed = cast(string)uc.uncompress(curChunk); 
     writeln(uncompressed); 
     auto stringRange = uncompressed.splitLines(); 
     foreach (string line; stringRange) 
     { 
      ***************** Do something with line 

상기 코드의 결과는 다음 ABCD 불행히도 기록 분리기 (ASCII 30)는 누락된다.

ubyte []를 문자열로 변환 한 후 데이터 레코드 구분 기호가 누락 된 것을 알게되었습니다.

내가 코드에서 변경해야합니까
  • 는 레코드 분리를 유지하기 :

    지금 나는 두 가지 질문이 있습니까?

  • 루프를 사용하지 않고 위의 코드를 작성하려면 어떻게해야합니까? 나는 한 줄씩 읽고 싶다.

편집

첫 번째 질문에 대한 좀 더 일반적이고 이해할 수있는 코드 :

ubyte[] temp = [ 65, 30, 66, 30, 67]; 
    writeln(temp); 
    string tempStr = cast(string) temp; 
    writeln (tempStr); 

결과는 다음과 같습니다 바람직하지 ABC.

+0

결과가 ABC입니까? 배열의 값 30도 문자로 캐스팅되며 [ASCII 30] (http://www.theasciicode.com.ar/ascii-control-characters/record-separator-ascii-html)에서와 같이 인쇄 가능한 문자가 아닙니다. code-30.html) – xtreak

+0

나는 또한 두 개의 서로 다른 소프트웨어에서 작은 샘플을 확인했습니다 : Windows cmd, 디스플레이는 괜찮아요, 또 다른 소프트는 'ABC'입니다. 문자열을 표시하기 위해 어느 소프트를 사용합니까? 실제로는 디스플레이 문제 일 뿐이지 만 파싱 오류가 있다고 생각하는 것은 불가능하다고 생각합니다. –

답변

2

문자 30은 인쇄 가능한 문자가 아니지만 일부 편집자는 그 자리에 기호를 표시 할 수 있습니다. 잃어 버리지는 않지만 인쇄되지 않습니다. ubyte[]에서 캐스팅은 일반적으로 ubyte[] 배열이 변경 가능하고 string은 변경 불가능하기 때문에 잘못되었습니다. ubyte[]char[]으로 전송하는 것이 좋습니다.

+0

이 경우에 좋은 사운드는'std.string.representation'의 반대입니다. '표현 '은 캐스트를 할 때 적절한 constness를 유지하지만 (캐스트를 사용하는 것보다 더 나은 이유 중 일부 임),'char'에서'ubyte'보다는'ubyte'로 이동하기 때문에 char 여기에 필요한 것의 역전. –