web-dev-qa-db-ja.com

テキストライターの代わりにメモリストリームを使用してファイルを作成するc#

現在、会計アプリケーションにインポートするテキストファイルを作成しているアプリケーションがあります。次のコードを使用してファイルを作成し、ファイルに行を書き込みます。

    TextWriter tw = new StreamWriter(ExtractFileName);

    tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");

複数の抽出ファイルを作成し、それらをSharpZipLib(#ziplib)を使用して単一の.Zipファイルに圧縮する計画を立てる必要があります。 MemoryStreamを作成/使用する必要があると思いますが、既存のコードを移植する方法がわかりません。

ありがとう。

31
tmcallaghan

できること:

MemoryStream  memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
86
Peter Lillevold

不要な抽象化を作成しないでください。エクスポータークラスはクールですが、複数のエクスポート戦略がある場合にのみ価値を追加します。それ以外の場合は、コードの中心的な目的から逸脱する混乱です。

エクスポーターをpracticeに追加したい場合は良い抽象化テクニックですが、infiniteがあります大量のコードを記述するときの抽象化の機会。特定のプロセスまたはデータセットの実装が複数ある場合、抽象化はモジュール性を作成し、コードを削減しますonly

9
Nathaniel

また、アプリの一部を切り離して、将来その一部を変更できるようにする良い機会であることをお勧めします。そのため、TextWriterは書き込み可能なストリームの優れた抽象化ですが、エクスポートクラスも抽象化することを検討してください。

例えば。今、あなたはこのようにそれをしたいです:

MemoryStream  memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

// tab-delimited export
IExporter exporter = new DelimiterExport(data, tw, "\t"); 
exporter.Export();

次のように簡単に変更できます。

// csv file (stands for "comma separated value", but you should actually
// use a culture-specific list separator instead)
var separator = Thread.CurrentThread.CurrentCulture.TextInfo.ListSeparator;
IExporter exporter = new DelimiterExport(data, tw, separator);

または他の実装:

// Excel export
IExporter exporter = new ExcelExport(data, tw);

プロトコルに依存しないインターフェイスを今すぐ提供することで、後で人生が楽になります。

6
Groo