2014-04-03 1 views
0

쉼표로 구분 된 보고서가 포함 된 CSV 파일을 읽는 작은 프로그램이 있습니다. 보고서 내에서 필드 중 하나는 날짜입니다.이 날짜는 날짜/시간으로 변환되며 특정 시간 프레임 내에있는 정보 만 가져옵니다. 여기 내 문제는 : 보고서는 실제로 특정 시스템에서 실행되는 작업 목록입니다. 그러나 작업 이름 중 일부는 쉼표를 자체적으로 포함합니다. 즉, 작업 이름에 쉼표가 있으면 작업 이름이 2 개의 셀로 나뉘어지기 때문에 Excel 출력 보고서는 매우 혼란 스럽습니다. 나는 프로그래밍에 조금 익숙하기 때문에 이것을 해결할 수있는 유일한 방법은 콤마로 구분 된 배열에서 필드가 몇 개인 지 확인하는 것입니다. 그리고 그것이 정상보다 크다면, 나는 직업 이름이 될 것이라는 것을 알고있는 분야 중 두 개를 연결할 것입니다. 그러나 작업 이름에 쉼표 2 개가 있으면 데이터에서 쉼표 1 개만 처리하도록 설정되어 있기 때문에 작동하지 않습니다.다른 배열의 배열 필드 바꾸기

내가 추가해야하는 것은 내가 읽은 CSV 보고서가 다른 응용 프로그램에 의해 생성되는데, 여기에서 어떻게 구분되는지는 제어 할 수 없습니다. 그렇지 않으면, 나는 그것을 파이프 또는 일종의 것으로 바꿀 것이다.

의견이 있으십니까? 다음은 그것을 다루는 코드의 일부입니다 :

StreamReader SR = new StreamReader(inputFile); 
StreamWriter SW = new StreamWriter(outputFile); 
string records; 
//read headers from first line 
string headers = records = SR.ReadLine(); 
SW.WriteLine(headers); 
DateTime YesterdayAM = Convert.ToDateTime(DateTime.Now.AddDays(-1).ToShortDateString() + " 05:00:00 AM"); 
while ((records = SR.ReadLine()) != null) 
{ 
    if (records.Trim().Length > 0) 
    { 
     string daterecord = GetDateTimeFromStringArray(records); 
     if (daterecord.Length > 0) 
     { 
      DateTime recordDate = Convert.ToDateTime(daterecord); 
      if (recordDate >= YesterdayAM) 
      { 
       string[] checkfields = records.Split(','); 
       if (checkfields.Length > 13) 
       { 
        string[] replacefields = { checkfields[0], checkfields[1] + " " + checkfields[2], checkfields[3], checkfields[4], checkfields[5], checkfields[6], checkfields[7], checkfields[8], checkfields[9], checkfields[10], checkfields[11], checkfields[12] }; 
        for (int i = 0; i < replacefields.Length; i++) 
        { 
         SW.Write(replacefields[i] + ","); 
        } 
        SW.Write(Environment.NewLine); 
       } 
       else 
       { 
        SW.WriteLine(records); 
       } 
      } 
     } 
    } 
} 
+0

이것은 비슷한 질문이라고 생각합니다. http://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file – skeryl

+0

일반적으로 CSV 파일에서 셀에 구분 기호가 있으면 따옴표로 묶어야합니다. CSV로 저장할 때 Excel에서 쉼표가 포함 된 셀과 관련됩니다. 이것이 완전히 불가능한 경우, 기술하는 기술을 사용하면 길이가 정확할 때까지 필드를 다시 결합하는 메소드를 호출하여 작업 이름 필드에 여러 쉼표를 처리 할 수 ​​있습니다. –

답변

0

그것은 이런 식으로 할 수있는 비트 해키,하지만 당신은 소스를 해결할 수 없으며 추가 쉼표 만에 나타날 것이다을 알고 경우 더 나은 아직

  string[] checkfields = records.Split(','); 
      while (checkfields.Length > 13) 
      { 
       // concat [1] & [2] into a new array 
       checkfields = checkfields.Take(1) 
        .Concat(new string[] { string.Join("", checkfields.Skip(1).Take(2).ToArray()) }) 
        .Concat(checkfields.Skip(3)).ToArray(); 
      } // if it's still too long it will loop again 

또는 :

  string[] checkfields = records.Split(','); 
      int extraFields = checkfields.Length - 13; 
      if (extraFields > 0) 
      { 
       // concat fields 1....1 + extraFields 
       checkfields = checkfields.Take(1) 
        .Concat(new string[] { string.Join("", checkfields.Skip(1).Take(extraFields).ToArray()) }) 
        .Concat(checkfields.Skip(extraFields + 1)).ToArray(); 
      } // avoids looping by doing it all in one go 

참고 : 하나 개의 필드 당신은 이런 식으로 뭔가를 할 수있는 LINQ 문이 안된이며, 가장 절대하지 않을 수도 있습니다 효율적인 방법. 또한 모든 "마술"번호는 유지 보수를 위해 상수로 대체되어야합니다.

+0

대단히 감사합니다! 감사합니다. 두 번째 방법을 시도 할 것입니다. – user3494110