2017-04-24 1 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として使用され、2番目のストリームは中間のゴミだけになります。メモリストリームには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; 
     } 
    } 
} 
関連する問題