32

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

    TextWriter tw = new StreamWriter(ExtractFileName);

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

複数の抽出ファイルを作成し、それらを SharpZipLib (#ziplib) を使用して 1 つの .zip ファイルに圧縮する必要があり、「メモリ内」でテキスト ファイルを作成し、それを使用して zip ファイルを作成するようにコードを変更したいと考えています。私は MemoryStream を作成/使用する必要があると思いますが、既存のコードを移植する方法がわかりません。

ありがとう。

4

3 に答える 3

91

あなたがすることができます:

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

tw.WriteLine("ref\tACCOUNT\tbatch\tDEBIT\tCREDIT\tDesc");
于 2009-04-23T13:05:56.277 に答える
8

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

優れた抽象化手法を実践するためにエクスポーターを追加したい場合は問題ありませんが、かなりの量のコードを記述する場合、無限の抽象化の機会があります。抽象化は、特定のプロセスまたはデータ セットの複数の実装がある場合にのみ、モジュール性を作成し、コードを削減します。

于 2012-10-26T14:00:14.387 に答える
6

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

たとえば、次のようにします。

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

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

于 2009-04-23T13:19:20.240 に答える