【问题标题】:.net MemoryStream, StreamWriter, FileStream combo causes special character when combining.net MemoryStream、StreamWriter、FileStream 组合在组合时会导致特殊字符
【发布时间】:2017-04-24 09:09:13
【问题描述】:

您好,我有以下代码,我从我正在处理的一项更大的任务中减少了这些代码。本质上,尽管我发现将内存流组合在一起时,我在连接位置上得到了一个特殊字符。下面是应用程序完整运行的代码,它显示了问题。在 Visual Studio Code 中打开生成的 export.csv 文件会在第 3 行的开头显示一个特殊字符。如果您在 excel 中打开 CSV,您会注意到第 3 行的开头与其他行的外观不同。

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;
        }
    }
}

【问题讨论】:

    标签: .net csv 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多