いまいち何が知りたいのかわからないのですが、簡易な実装の例を話すと
datatabeleなんて使うのめんどくさいので使わない。
1レコードを格納するModelとなるクラスを作り、そのコレクションにDBの結果を入れる
(コレクションは、ListでもArrayでもなんでもよいかと(用途に応じて変えればよいかと)
→テキスト(CSV)で出力するだけでよいのかと。
ざっくりですが、こんな1レコードを格納するModelを作ります。
イミュータブルを想定してプロパティはReadOnlyですが、違ったらsetterをつけてください。
cs
1public class SalesModel
2{
3 public string OfficeCode { get; }
4
5 public int Sales { get; }
6
7 public string OfficeDescription { get; }
8
9 public SalesModel(string officeCode, int sales)
10 {
11 OfficeCode = officeCode;
12 Sales = sales;
13 OfficeDescription = SalesUtil.GetOfficeDescription(officeCode);
14 }
15
16 //csvに出すためのクラスだったら、ToStringメソッドでcsv出力しちゃえばと
17 public override string ToString() => $"\"{OfficeCode}\", \"{OfficeDescription}\", \"{Sales}\"";
18 public static string GetHeaderString() => "営業所コード, 売上高, 営業所";
19}
営業所コードの要件については、簡易なユーリティティを作っておきましょうか。
SalesModelの中にstaticに実装しても構いませんよ。
cs
1public static class SalesUtil
2{
3 //とりあえず値をべた書きしましたが、DBからとってくるのであればそう書き換えればよいかと。
4 private static IReadOnlyDictionary<string, string> OfficeDic
5 = new Dictionary<string, string>()
6 {
7 ["0100"] = "本店",
8 ["0101"] = "池袋支店",
9 ["0102"] = "品川支店",
10 ["0103"] = "五反田支店",
11 };
12
13 public static string GetOfficeDescription(string officeCode)
14 {
15 string officeDescription;
16 OfficeDic.TryGetValue(officeCode, out officeDescription);
17 return officeDescription ?? string.Empty;
18 }
19}
本題ですが、DBから取得した値をSalesModelに入れて、ファイルに書き出すだけで行けますね。
cs
1public void Run()
2{
3 //DBからデータ取ってきたとします。
4 var dataFromPersistence = GetSalesFromOracle();
5
6 //で、SalesModelのリストを作成。
7 //小さいプログラムで保守性も気にすることないならDBから直接salesListを作ってもよいかと。
8 var salesList = dataFromPersistence
9 .Select(d => new SalesModel(d.Branch, d.Revenue)).ToList();
10
11
12 //後は、ループか何かの処理でファイルに書き出せばOKですね。
13 salesList.ForEach(s =>
14 {
15 //csvの文字列をとるには、ToStringで楽々アクセス
16 var csvString = s.ToString();
17
18 //あとはファイルに書き込む処理をしていただければと。
19 });
20
21
22}
23
24//データベースから何か値をとってきたと仮定したメソッドです。
25//戻り値の型も仮で勝手に作ってます。
26//仮に作ったPersistenceDataクラスを説明しておくと、
27//売り上げを表すRevenueと、営業所コードを表すBranchがあると仮定してます
28private List<PersistenceData> GetSalesFromOracle()
29{
30 return new List<PersistenceData>()
31 {
32 new PersistenceData() {Revenue = 1, Branch = "0101"},
33 new PersistenceData() {Revenue = 2, Branch = "0100"},
34 new PersistenceData() {Revenue = 3, Branch = "9999"},
35 };
36}
わざわざModelとなるクラスを作ったのは、DBから取得した値に対して、以下2つ
- 営業所コードから営業所の名称を入れる
- 1レコードのCSVの文字列を生成する
という振る舞いをまとめたかったからです。
ヘッダーについては、大丈夫ですよね。
ファイルの編集については、(ファイルがなければファイルを作って、)
CSVのデータをファイルに上書きすればよいかと。
(一応書いておくと、DBからデータの不明なので、IEnumerableにして遅延実行とかはあえてしていません。)