2010-02-14 5 views
2

내가 CSV 파일을 만드는 오전과 내가 새로운 클래스 "CommaDelimitedStringCollection"에 와서 순간에 의 StringBuilder을 사용하고이된다.효율적인 모두 StringBuilder 또는 CommaDelimitedStringCollection

누구나 파일 데이터를 쓰는 것이 더 낫다고 말할 수 있습니까? 또한 TextWriter을 어떻게 사용한다고 생각하십니까?

감사

+0

[수동 쉼표 분리 대 멋진 CommaDelimitedStringCollection 클래스!] (http://izlooite.blogspot.com/2009/12/manual-comma-separation-versus-cool.html) –

답변

2

CSV를 작성하는 것이 매우 복잡한 작업 인 경우 CommaDelimitedStringCollection과 같은 도우미에 의존 할 수 있습니다. 그러나 복잡하지 않으므로 여기에 관련 퍼포먼스 히트와 함께 추가 헬퍼 클래스를 도입 할 필요가 없습니다.

일반 ToString() 메서드를 구현하는 것과 같이 어떤 이유로 메모리에 문자열을 작성해야한다면 직선 연결 대신 StringBuilder을 사용합니다. 그러나이 경우에는 어떤 종류의 스트림에 쓰고 있으므로이 추가 단계가 필요하지 않습니다.

TextWriter은 추상 클래스이지만 클래스의 계층 구조를 원할 경우, 구체적으로 StreamWriter입니다. 이 클래스에는 많은 생성자 오버로드가 있습니다. 하나는 스트림에 직접 쓰고 싶은 경우 로컬 파일에 쓰기를 원하면 파일 이름을 사용하고 다른 하나는 Stream 개체를 사용합니다 (예 : ASP.NET의 경우 Response.OutputStream).

는 사실은 빠른 Google 검색을했고, 그, 그래서 여기에 당신이해야 할 노력하고 무엇 하나 인 경우, 실제로 CSV 다운로드를 구현의 좋은 사례가있을 나타나지 않습니다 :

void ExportCsvAttachment(IEnumerable<Customer> customers) 
{ 
    Response.Clear(); 
    Response.ContentType = "text/plain"; 
    Response.AddHeader("Content-Disposition: attachment;filename=Customers.csv"); 
    using (StreamWriter writer = new StreamWriter(Response.OutputStream)) 
    { 
     WriteCsv(writer, customers); 
    } 
    Response.End(); 
} 

void WriteCsv(TextWriter writer, IEnumerable<Customer> customers) 
{ 
    foreach (Customer cust in customers) 
    { 
     writer.Write(cust.ID); 
     writer.Write(','); 
     WriteCsvString(writer, cust.Name); 
     writer.Write(','); 
     WriteCsvString(writer, cust.PhoneNumber); 
    } 
} 

void WriteCsvString(TextWriter writer, string s) 
{ 
    writer.Write('"'); 
    writer.Write(s.Replace("\"", "\"\"")); 
    writer.Write('"'); 
} 

이것은 문자열 주위의 CSV - 따옴표에 가장 일반적인 이스케이프 메커니즘을 사용하고, 다른 따옴표는 이스케이프 문자로 사용합니다.

대신 로컬 파일로 내보내려면 Response 줄을 모두 ExportCsvAttachment으로 제거하고 경로를 사용하는 StreamWriter 생성자를 사용하십시오.

0

당신이이 옵션을 선택해야합니다 파일에 데이터를 밀어 같은 TextWriter에서와 같은 스트림을 사용할 수있는 시간입니다.

당신이 그것을 구축해야한다면 나는 stringbuilder를 사용할 것입니다. 그것이 무엇을위한 것인가, 그러나 당신은 제품을 계속해서 memeory에두고 있고 추가 할 때 성능 벌칙을 초래합니다.

컬렉션과 관련이있는 것은 무엇보다도 붉은 깃발을 던져야합니다. 사용이 불가피하지 않은 한.

그냥 내 2 페소.

+0

아니면 연구 목적으로 탐험. 절대는 거의 좋은 생각이 아닙니다. 때로는 일을 끝내야 할 때가 있습니다. –

1

확실히 ASP.Net 용 TextWriter를 사용하십시오. 트릭은 여기서 생각하는 텍스트 작성자가 출력/응답 스트림에 직접 연결되어 있는지 확인하는 것입니다. 이렇게하면 CSV 응답의 전체 내용을 메모리에 저장하지 않고 출력 버퍼의 크기로 제한 할 수 있습니다.

0

필자는 CommaDelimitedStringCollection을 한번도 사용한 적이 없지만 문서를 한눈에 살펴본 후 조금만 시도해 본 결과 CSV 파일에 한 줄을 나타내는 것이 맞는지는 모르겠다. 하지만 ToString()은 CSV 파일을 읽을 때 매우 유용 할 수 있지만 헤더 행을 사용하여 완전히 새로운 파일을 만들 때 유용하지 않습니다.

당신은 아마 내가 모두 StringBuilder를 사용하는 것이 좋습니다 것이 하나의 데이터 라인에 비해 헤더 등을 갖고 싶어하고, 내 생각은 CommaDelimitedStringCollection이가 된 toString 자신의 문자열 값()의 ​​생성의 StringBuilder 사용하기 때문에

관련 문제