2017-04-24 4 views
1

안녕하세요 저는 작업중인 더 큰 작업에서 줄인 다음 코드를 가지고 있습니다. 본질적으로 나는 메모리 스트림을 함께 결합 할 때 결합 위치에서 특수 문자를 얻는다는 것을 알았지 만. 아래는 문제를 보여주는 앱 실행 코드입니다. Visual Studio 코드에서 결과 export.csv 파일 열기 3 행 시작 부분에 특수 문자가 표시됩니다. Excel에서 CSV를 열면 3 행의 시작이 다른 행과 다른 모양임을 알 수 있습니다..net MemoryStream, StreamWriter, FileStream 콤보가 결합 할 때 특수 문자가 발생합니다.

using System; 
using System.IO; 
using System.Text; 

namespace testingMemory 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var stream1 = GetMemoryStream("section1"); 
      var stream2 = GetMemoryStream("section2"); 

      var fileStream = new FileStream("export.csv", FileMode.Truncate, FileAccess.Write); 

      stream1.WriteTo(fileStream); 
      stream2.WriteTo(fileStream); 
     } 

     public static MemoryStream GetMemoryStream(string section) 
     { 
      var wrapper = "\""; 

      var memoryStream = new MemoryStream(); 

      var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8); 

      streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}"); 
      streamWriter.Flush(); 

      streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}"); 
      streamWriter.Flush(); 

      return memoryStream; 
     } 
    } 
} 

답변

1

각 스트림에는 byte order mark이 포함되어 있습니다. 그리고 둘 다 복사하면 첫 번째 스트림의 바이트 순서 표시가 파일의 BOM으로 사용되고 두 번째 스트림의 바이트 순서 표시는 중간의 쓰레기입니다. 메모리 스트림에 BOM이 없어야합니다.

using System; 
using System.IO; 
using System.Text; 

namespace testingMemory 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var stream1 = GetMemoryStream("section1")) 
      using (var stream2 = GetMemoryStream("section2")) 
      { 
       using (var fileStream = new FileStream("d:\\export.csv", FileMode.Truncate, FileAccess.Write)) 
       { 
        stream1.WriteTo(fileStream); 
        stream2.WriteTo(fileStream); 
       } 
      } 
     } 

     public static MemoryStream GetMemoryStream(string section) 
     { 
      var wrapper = "\""; 

      var memoryStream = new MemoryStream(); 

      // Using a non-default UTF-8 encoding with BOM not used: 
      var streamWriter = new StreamWriter(memoryStream, new UTF8Encoding(false)); 

      streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}"); 
      streamWriter.Flush(); 

      streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}"); 
      streamWriter.Flush(); 

      return memoryStream; 
     } 
    } 
}