2013-12-23 4 views
1

이것은 완전히 새로운 것이므로 어디서부터 시작해야할지 모르겠습니다. 로컬 네트워크에있는 기존 일반 텍스트 파일의 데이터를로드하여 서브 필드를 채우는 하위 클래스 Dictionary이 있습니다.특정 환경에서 파일에 문자가 없습니다.

파일에는 몇 개의 헤더 행이 있고, 그 다음 데이터는 헤더가 반복되는 한 페이지 당 설정된 행 수 (59)까지 데이터 (각 행은 대시 선으로 구분됩니다)가 있습니다.

최근에는 원래 필요하지 않은 데이터에 대한 지원을 추가해야한다는 요구가있었습니다. 이 데이터에는 동일한 수의 헤더 열이 없습니다. 대신 각 데이터 세트에 포함될 특수 문자를 찾기로했습니다. 코드는 다음과 같습니다 :

/// <summary> 
/// Load the work order information from the chart on the network. 
/// </summary> 
/// <param name="workOrder">Work order to load</param> 
/// <param name="model">Model number of the work order to load. Loaded from MES if null.</param> 
public WorkOrderInformation(String workOrder, String model) 
{ 
    if (model == null) 
     model = MES.getOrder(workOrder).Model; 

    String fileLocation = Path.Combine(Path.Combine(WorkOrderLocation, model), workOrder.Insert(4, "-") + ".TXT"); 

    StreamReader file = new StreamReader(File.Open(fileLocation, FileMode.Open, FileAccess.Read)); 

    int currentLineNumber = 0; 
    while (!file.EndOfStream) 
    { 
     string line = file.ReadLine(); 
     Logging.Log.writeLog(log, "Loaded line | " + line); 
     currentLineNumber++; 
     int lineOnPage =(currentLineNumber % 59); 
     // Old way to determine if line contains data 
     //if (lineOnPage >= 10 && lineOnPage % 2 == 0) 
     if (line.Contains(((char)65533).ToString())) 
     { 
      Logging.Log.writeLog(log, "Line added to collection"); 
      string[] sections = line.Split(new char[] { '|' }); 

      if (sections.Length > 1) 
      { 
       UnitInfo newUnit = new UnitInfo(sections[0].Trim()); 
       for (int j = 1; j < sections.Length; j++) 
       { 
        newUnit.Add(sections[j].Trim()); 
       } 
       this.Add(newUnit.TestNumber,newUnit); 
      } 
     } 
    } 
    file.Close(); 
} 

내 개발 컴퓨터 (Windows 7) 및 하나의 배포 컴퓨터 (Windows 2000)에서는 완벽하게 작동합니다. 다른 배포 시스템 (Windows XP)에서는 문자가 단순히 줄에 없습니다. 전체 줄을 기록 할 때 글자가 쓰여지지 않고 로그에 "내선을 추가했습니다"라는 메시지가 로그에 기록되는지 확인합니다.

3 대의 모든 컴퓨터에서 동일한 파일로 실행 중입니다.

편집 :

내가 대신 라인 자체의로드 라인의 길이를 저장하는 내 로깅을 변경하고 캐릭터가 단순히 string에서 누락 된 것을 확인했다. 이 로그는 선이 65 개 문자의 길이를 말한다 작동하는 기계에는 64

2 편집하지 않으며 하나에 : 나는이 문제를 재검토하기로 결정했습니다

. 내 작업이 완료 얻을

double dummy; 
if(double.TryParse(sections[0],out dummy)) 

하지만 이런 일이 왜 여전히 매우 궁금 대신 첫 번째 값이 숫자 인 경우 나 시간 앞서 문자열을 분할하고 확인하기로 결정했습니다 그 특수 문자를 검색 이 질문을 적어도 설명의 희망으로 열어 둘 것입니다.

편집 3 : 내가 생각했던 것보다 더 보인다

이 나뉩니다. Dan이 지적했듯이 내가 찾고있는 값 (0xFFFD)은 실제로는 분명히 있어서는 안되는 replacement character입니다. 인쇄물에서 문자를 식별 할 수 없습니다. 16 진수 편집기에서 파일을 열고 문자가 0x00F8 (ø)이어야한다는 것을 알았습니다.

그래서 StreamReader가 대체 문자로 0x00F8을로드하고 있거나 아닌 것으로 보입니다. 이제 문제는 왜입니까?

+0

인코딩 문제 일 수 있습니다. 다음은 기본값으로 설정하는 방법을 보여주는 질문입니다. http://stackoverflow.com/questions/469163/how-to-set-the-default-encoding-in-windows-xp – TyCobb

+0

@TyCobb 오 그 말이 될 것입니다. 환경에 따라 인코딩이 다를 수도 있다는 것을 알지 못했지만 인코딩 매개 변수를 허용하는 StreamReader 생성자를 사용하고 싶습니다. Windows 7이 어떤 인코딩을 사용하고 있는지 파악하려면 어떻게해야합니까? (작동하기 때문에 그 이후로 같은 것을 사용할 수 있습니다.) – Fr33dan

+0

그래, 나는 당신이 현재 어떤 테스트를 더 쉽게했는지 확신 할 수 없었다. Windows 7에서 어디에서 찾을 수 있을지 잘 모르겠습니다. 표준 'Encoding.Unicode'라고 생각합니다. 일시적으로'Encoding.Default'를 호출하고 당신이 그 머신에서 얻은 것을보기 위해 중단 점을 호출 할 수 있습니다. – TyCobb

답변

0

나는 다음과 같은 코드를 함께했다 방법이 매우 궁금 :

if (line.Contains(((char)65533).ToString())) 

유니 코드 65533 또는 0xFFFD는 특수 문자가 replacement character라고합니다. 이 문자의 목적은 알 수 없거나 설명 할 수없는 문자 대신 사용하는 것입니다.

이와 같이 텍스트 줄에는 일반적으로 어떤 이유로 든 재현 할 수없는 다른 문자가 있음을 나타냅니다. 이유는 인코딩, 글꼴 등일 수 있습니다.

이 기호를 찾으려면이 필요하다는 단순한 사실은 근본적인 결함 인 것 같습니다. 이 등장 인물은 어디에서 왔을까요? 파일에서 어떻게 끝날까요?

+0

다른 곳에서는 본 적이없는 캐릭터이지만, 디버깅하는 동안 해당 심볼의 char 값을 보면서 그 가치를 얻었습니다. 파일은 집에서 생성되지 않으며 당사의 부품 공급 업체 중 한 곳에서 제공됩니다. 그것은 [이] (http://en.wikipedia.org/wiki/%C3%98)와 같이 막연하게 보이지만 기울어 진 것 대신 수직선이 있습니다. – Fr33dan

+0

음, 그리스 문자 인 Phi, http://en.wikipedia.org/wiki/Phi가 될 것입니다. 그러나 Phi 용 유니 코드는 가장 확실하게 0xFFFD가 아닙니다. 문자 코드를 식별하는 데 실수가 있었음에 틀림 없습니다. 이중 검사를 위해 16 진수 편집기로 열어보십시오. – Dan

+0

흥미 롭습니다. 나는 내가 기회를 얻을 때를 점검 할 것이다. (그것은 휴일이 주어진 뜨거운 분 일 수 있었다). – Fr33dan

관련 문제