2009-10-26 1 views
1

바꿀 비트가 필요한 문서가 일정한 경우 (일종의 우편물 시나리오) 대체 할 수있는 가장 빠른 방법에 대한 조언이 필요합니다.C# superfast "mailmerge"type 바꾸기

물론 string.replace와 regexp를 사용하여 대체 할 수있는 방법이 많이 있지만 매치 할 때마다 입력 된 문서를 구문 분석해야하는 것처럼 보입니다. 그것이 제가 최적화하려고하는 것입니다.

답변

2

나는 아마도 이전 요소와 다음 요소 사이에있는 텍스트 인 각 요소가있는 배열로 문서를 분할하는 것이 좋습니다. 그런 다음 바꾸기 대신 문자열 배열을 사용하여 각 대체 토큰과 함께 분할 배열의 내용을 간단히 삽입합니다.

일부 의사 : 당신은 구문 분석하지 않으려하고 입력 문서가 일정대로

doc_array = split(input_doc, "token marker") 

for each replace_array in set_of_replace_arrays: 
    this_doc = "" 

    while elements remain in doc array: 
     this_doc.concat(next doc element) 

     if any elements remain in replace array: 
      this_doc.concat(next replace element) 

    output this_doc 
+1

음, "String concatenation"을 "StringBuilder"로 바꿀 수도 있습니다 ;-p –

+0

Right. 느슨한 의미로 문자열 연결이라는 용어를 사용합니다. 어떤 점에서 또는 다른 결과는 부분 문자열의 연결이 될 것입니다. pseduocode는 concat을 사용합니다. 왜냐하면 그런 식으로 언어를 더 많이 사용하지 않기 때문입니다. 그러나 C# 전용 StringBuilder가 더 효율적이거나, 가능한 경우 다른 언어로도 동등합니다. – Amber

+0

고마워요, 그 생각에 맞는 라인을 따라. 내가 할 수있는 가장 빠른 방법은 문자열 고정 배열 (string [] s = new string [10])을 만들고 고정 섹션 (s [1] = "Dear Mr.")을 채운 다음 루프 배열의 올바른 위치 (예 : s [2] = firstName)에서 스왑하는 변수를 통해 전체 항목을 조인합니다 (return string.Join (string.Empty, s)). 어마 어마하게 빠른! C#에서는 다양한 문자열을 덮어 쓸 수 없으므로 StringBuilder는 시작하지 않았습니다. 내가하고 싶지 않은 것은 매번 문자열 전체를 재구성하는 것입니다. 감사합니다. –

0

글쎄, 당신은 당신의 원본 문서를 처리하는 MemoryStream를 사용하여 자신의 절대 위치를 사용하여 비트를 변경할 수 있습니다 .

또 다른 방법은 자리 표시 자로 그 String.Format 마커를 사용할 수 있습니다 :

string input = "Dear {0} {1}"; 
//... 
return String.Format(input, "Mr.", "Farias"); 
+0

당신의 변수가 항상 같은 길이라면 MemoryStream 아이디어가 작동 할까? string.Format은 매우 깨끗하지만 최적화 된 방법이 궁금합니다. 나는 그것이 실행될 때마다, {0}과 {1} 비트에 대한 전체 텍스트를 검색해야한다고 생각합니다. 이것은 내가 피하려고했던 것입니다. –

+0

MemoryStream : 네, 길이는 같지만'{0}'(공백을주의하십시오)와 같은 것을 할 수 있습니다; 아마 당신은 어떻게 든 입력 템플릿을 파싱해야 할 어떤 기술을 사용합니다. 일부 성능 테스트를 작성하는 것이 좋으므로 각 방법을 공정하게 비교할 수 있습니다. –

0

증가 유연성을 위해, 당신은 XslCompiledTransform를 사용하고 그것을 출력 텍스트를 가질 수있다. 빠른 XML 및 텍스트 생성에 최적화되어 있으며 필요한 경우 일부 논리도 포함 할 수 있습니다.