質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

2回答

9857閲覧

CSVファイルの出力(C#、Oracle)

Richelieu

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

1クリップ

投稿2016/09/27 16:11

編集2016/09/27 16:18

###CSVファイル出力の実現方法について

いろいろな方法があると思いますが、簡単な実装(画面処理:css)を教えてください。
機能概要は次の通り。後述の通りまったく方法がわからないわけではありませんが、
対象データも少ないため、シンプルな実装にしたいと思います。
処理の考え方ととテキスト編集処理部分の実装を教えていただきたいのです。
ファイルの保存先やDB接続(SQL、アクセサなど)については問題ありません。

###実装したい機能

①.画面上のボタン押下すると処理実行
※すでにCSVファイルがあれば削除する。
②.Oracle DB の単一テーブルをもとにCSVファイルを編集し、任意のフォルダへ保存する。
③.カラム名は「EIGYOUCD」や「URIAGE」であるため、CSVヘッダー部分は「営業所コード」や
「売上高」というように独自に編集する。
④.「営業所コード」ではわからないので「EIGYOUCD = 0100」のとき「営業所 = 本店」というように
テーブルにはない列を追加する。(5パターンしかないのでCSV作成処理内で行う)
⑤.CSVファイルイメージ
"営業所コード","営業所","売上高"
"0100","本店","50000"
"0300","福島営業所","43000"
⑥.webconfigで指定した場所へCSVファイルを保存

###試したこと
課題に対してアプローチしたことを記載してください

次のような実装ならわかります。
①.datatableを作成し、SQL文で取得可能な営業所コードと売上高をセットする
②.datatable2を作成し、ヘッダーを編集
③.②へ①をセット
④.営業所コードをもとに営業所列をセット
⑤.完成したdatatable2をTextWriterを使用し、foreachで1行ずつテキスト編集

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

~開発環境~
●C#
●Oracle
●.NET 2.0
●visual studio 2005

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2016/09/27 18:19

丸投げでは困るので、差支えない範囲で途中までで良いから CREATE TABLE, INSERT, コードを提示されては? >④.「営業所コード」ではわからないので「EIGYOUCD = 0100」のとき「営業所 = 本店」というように >テーブルにはない列を追加する。(5パターンしかないのでCSV作成処理内で行う) たとえ今はデータが5件しかなくても営業所の開設や閉鎖、名称変更の度にあちこちで持っているであろう営業所名を設定するコードを変更したくないのでテーブルにした方が良いです。Excelじゃないですし。
退会済みユーザー

退会済みユーザー

2016/09/28 00:42

C# で作れるアプリは多々ありますが、何を作ってるんですか? Windows Forms? WPF? コンソールアプリ? ASP.NET Web Forms? ASP.NET MVC? その他?
len_souko

2016/10/01 05:48

実装したい内容と試したことを書くんだったら対応した番号にしてどう詰まったのかを書くべきだし、質問の場合は実装したい内容をたくさん載せるのはただの丸投げ。それぞれの詰まった部分に関して質問をすべき。全体の設計に関する質問であるのなら、どこでうまく設計できないのか、どう自分でうまくできてないと判断しているのかなどを書かないと、この内容だとこの通りにただで設計してくださいという本来なら費用のかかる作業をタダで済まそうとしている様にしか読み取れません
guest

回答2

0

DapperとCsvHelperをnugetから入れたら簡単です。

適当なクラスにDapperで値を書き込み、後はCsvHelperで吐き出します。

データモデルの定義。

public class SalesModel { public string EigyoCd { get; set; } public int Uriage { get; set; } public string Description { get { switch(EigyoCd) { case "0100" return "本店"; // 他のもここに… } return string.Empty; } } }

Dapperでデータを取ってきます。

public IEnumerable<SalesModel> Get() { string sql; // ここに検索用のクエリを入れます SELECT EIGYOCD, URIAGE FROM t WHERE ...; // このクラスにIDbConnectionがあると仮定して…またはDbConnectionを作成して return connection.Query<SalesModel>(sql); }

CsvHelperでCSVに成型するためのMapクラスの定義。

public class SalesCsvClassMap : CsvClassMap<SalesModel> { public SalesCsvClassMap() { Map(m => m.EigyoCd).Name("営業所コード"); Map(m => m.Description).Name("営業所"); Map(m => m.Uriage).Name("売上高"); } }

後はこれを使って出力します。

using CsvHelper; using CsvHelper.Configuration; using System.IO; // TextWriterはStreamWriterとかを使えばいいでしょう。 public Print(TextWriter writer, IEnumerable<SalesMap> records) { using (var csvWriter = new CsvWriter(writer)) { // マッピングに使うクラスの指定 csvWriter.Configuration.RegisterClassMap<SalesCsvClassMap>(); // ヘッダ行を出すように設定 csvWriter.Configuration.HasHeaderRecord = true; // 各カラムをダブルクォーテーションで括るように設定 csvWriter.Configuration.QuoteAllFields = true; // 出力 csvWriter.WriteRecords(records); } }

投稿2016/12/07 05:41

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru666

2016/12/07 05:44

と思ったら、.Net 2.0ですか…動かないかもしれないなぁ。 古い技術で書かれてる場合は手抜きできないんで、せこせこ書くしかありません。
guest

0

いまいち何が知りたいのかわからないのですが、簡易な実装の例を話すと
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にして遅延実行とかはあえてしていません。)

投稿2016/11/09 12:49

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BEACHSIDE

2016/11/09 12:52

投稿した直後に環境が「.NET 2.0」と気づきました。LINQとか使えないですね。 ごめんなさい!。 これからでなきゃいけないので、 読み解いていただけると助かります。不明点あれば言ってくれれば明日更新しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問