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

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

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

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

2回答

8183閲覧

CSVファイルを使って、データベースに初期データを取り込みたいです。

short

総合スコア13

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2017/11/14 08:51

こんにちは。
Visual Studio 2017 Communityを使ってプログラミングしています。
OSはWindows10です。

###前提・実現したいこと
ASP.NET MVCのプロジェクトを作っています。
CSVファイルを使って、データベースに初期データを取り込みたいです。
1件だけなら、下記コードで可能です。

###該当のソースコード

C#

1using System.ComponentModel.DataAnnotations; 2using System.Data.Entity; 3using System.Linq; 4 5namespace CSVTableProject.Models 6{ 7 public partial class CSVTable 8 { 9 public static void Initialize(DbContext context) 10 { 11 var t = context.Set<CSVTable>(); 12 t.Add(new CSVTable() 13 { 14 Month = "月", 15 CreateDate = "作成日", 16 FiscalYear = "年度", 17 Title = "名前", 18 Price = "値段" 19 }); 20 context.SaveChanges(); 21 } 22 } 23}

そこで、

C#

1 foreach(string line in lines){ 2 string[] cells in line.Split('\t'); 3 t.Add(new CSVTable() 4 { 5 Month = cells[0], 6 CreateDate = cells[1], 7 FiscalYear = cells[2], 8 Title = cells[3], 9 Price = cells[4] 10 }); 11 }

のようにすればよいと考えたのです。

###発生している問題
ここで困っているのが、cellsの数、つまりテーブルの列が50個あることです。
そういう表が50種類くらいあり、コーディングの手間を考えるとくらくらしそうです。

こういうときって、cells[0]をMonthとかに順番に代入する方法、なにかありませんか?

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017 Community 15.3.3
.NET Framework 4.7.02053
Windows10 home

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/11/14 09:43

DB は何ですか? そのバージョン・エディションは? そのぐらいは最初の質問に書きましょうよ。
退会済みユーザー

退会済みユーザー

2017/11/14 09:47

ASP.NET MVC とどういう関係があるんですか? ASP.NET MVC アプリを作って、クライアントがブラウザから CSV ファイルを Web サーバーにアップロードして、Web サーバーで CSV ファイルの情報を DB に INSERT したいということですか? そうでなければ全く見当違いのことをしているように見えます。
退会済みユーザー

退会済みユーザー

2017/11/14 09:57 編集

ASP.NET はとりあえず関係なくて(後で ASP.NET アプリでその DB を使うのかもしれませんが)、DB に CSV ファイルの情報を、手段は問わず、INSERT できればいいのではないですか?
short

2017/11/15 05:52

ASP.NET MVC とどういう関係があるんですか? ASP.NET MVCのプロジェクトです。
short

2017/11/15 05:53

Q ASP.NET MVC アプリを作って、クライアントがブラウザから CSV ファイルを Web サーバーにアップロードして、Web サーバーで CSV ファイルの情報を DB に INSERT したいということですか? A ASP.NET MVC アプリを作っています。ローカルPC=開発マシンでCSV ファイルを Web サーバー=開発マシンに登録して、初期データを入れようとしています。
short

2017/11/15 05:55

Q ASP.NET はとりあえず関係なくて A ASP.NETのプロジェクトなので、無関係ではない気がします。
short

2017/11/15 05:56

Q DB に CSV ファイルの情報を、手段は問わず、INSERT できればいいのではないですか? A 手段はC#のコードでしたいです。
退会済みユーザー

退会済みユーザー

2017/11/15 08:10

またまた話が通じてないようです。最終的な目的は ASP.NET MVC5 アプリを勉強するために使う SQL Server のテーブルを既存の LocalDB の DB(.mdf ファイルが App_Data フォルダにあるはず)に作れればいいのですよね? それを、MVC の C# のコードでやる必要はないはず。できないことではありませんが、それを DB が何かと言う質問に答えられなかった質問者さんに説明するのは気の遠くなるような話です。
short

2017/11/15 09:04

はい。そう思います。基本、MVCの本の手順にしたがって勉強しています。なのでMVCのC#のコードでやるのは所与なのです。とてもすれ違っているように思います。なぜMVCのC#のコードでやってはいけないのでしょう?
退会済みユーザー

退会済みユーザー

2017/11/15 09:30

CSV ファイルを SQL Server にインポートするのを MVC の C# のコードで行うのは、MVC の勉強という面からは全く的外れで、そんなことに時間を費やすのは無駄だからです。それは回答者や一般閲覧者にとってもです。ここはあなた専用の Q&A サイトではないということも考えるべきです。
退会済みユーザー

退会済みユーザー

2017/11/15 09:38

EF Code First の機能を利用して DB を生成し、テストデータをイニシャライザで準備するという方法なら MVC の範疇と言えないこともないので、話に乗れそうです。その方向で進めてみてはいかが? ダメと言うならここからは撤退します。
short

2017/11/15 09:48

その方法を行っているつもりなのですが、どうしてそう見えないのでしょう? テストデータがでかいので、手で書くのは無理なので、csvから読みたいというだけです。
退会済みユーザー

退会済みユーザー

2017/11/15 09:56 編集

どうしてそう見えないかって、その方法「テストデータをイニシャライザで準備する」ではないから。とにかく、あなたが CSV にこだわるなら自分は撤退します。他の方の回答をお待ちください。
short

2017/11/15 14:31

「テストデータをイニシャライザで準備する」ときに、テストデータはどう用意するものなのですか? csvにこだわっているわけではないのですが、大量のテストデータを入れたいのです。csvがいちばんかんたんな気がしているのですけど。大量のテストデータをいれる、もっとかんたんな方法があるのでしょうか?
退会済みユーザー

退会済みユーザー

2017/11/16 03:59

大量って最初の質問に書いてあるようにたかが 50 レコード程度ですよね。だったら 50 行書くのもそれほど手間ではないと思いますが。50 行書く代わりに CSV ファイルから読んでくるという方法は使えるでしょうが、CSV ファイルの形式がどうなっているかとか、主キーがどうなってかいるとか、データ型はどうなっているかとかを明確にして、具体的な方法をあなたに伝えるのは、あなたの力量を想像するに、話が伝わらなくて無理だと思ってます。
short

2017/11/16 10:30

はあ。50×50で2500あるんですけど。結局なんですか? 嫌がらせですか?
退会済みユーザー

退会済みユーザー

2017/11/16 11:04 編集

嫌がらせなんかでははなくて、MVC の C# のコードでやろうとすることが間違っていると言っています。聞く耳持たないもしくは何を言っても理解しようとしないようですね。お互いもう関わるのは止めましょう。ハンドル名は変えないようにお願いします。
guest

回答2

0

CsvHelperというライブラリを使うと、シンプルに実現できると思います。
手前味噌ですがこちら参考記事です。

【モデル】

cs

1using Microsoft.EntityFrameworkCore; 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using CsvHelper.Configuration.Attributes; 7using System.Globalization; 8using System.IO; 9using System.ComponentModel.DataAnnotations; 10 11namespace CSVTableProject.Models 12{ 13 public partial class CSVTable 14 { 15 public static void Initialize(DbContext context) 16 { 17 // 省略 18 } 19 20 public CSVTable() { } 21 22 [Key] 23 public int Id { get; set; } 24 [Name("月")] 25 public string Month { get; set; } 26 [Name("作成日")] 27 public string CreateDate { get; set; } 28 [Name("年")] 29 public string FiscalYear { get; set; } 30 [Name("タイトル")] 31 public string Title { get; set; } 32 [Name("値段")] 33 public string Price { get; set; } 34 35 public static IEnumerable<CSVTable> ReadCsv(string csvPath = @"./data.csv") 36 { 37 CultureInfo cultureInfo = new("ja-JP"); 38 using StreamReader stream = new(csvPath, Encoding.UTF8); 39 using CsvHelper.CsvReader csv = new(stream, cultureInfo); 40 csv.Read(); 41 csv.ReadHeader(); 42 43 return csv.GetRecords<CSVTable>() 44 .Select(x => new CSVTable() 45 { 46 Month = x.Month, 47 CreateDate = x.CreateDate, 48 FiscalYear = x.FiscalYear, 49 Title = x.Title, 50 Price = x.Price, 51 }).ToList(); 52 } 53 } 54}

【使う側】

cs

1var tabel = Models.CSVTable.ReadCsv(); 2foreach (var record in tabel) 3 context.Add(record); 4 5context.SaveChanges();

投稿2021/09/18 04:41

t13801206

総合スコア4

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

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

0

メタプログラミングをする。
具体的には、

http://blog.shos.info/archives/2013/07/csharp_reflectionqa.html

この記事あたりを参考にして、propertyInfo.SetValue を使う。
そのやり方だと速度が遅いけど、一回だけなら、まぁいいでしょ。早くやるには「式木」ってのを使います。

もう一つは、プログラム自体をプログラムで書くT4テンプレートを使うですかね。
まぁ、プログラムの繰り返しているところをプログラムでテキストで出力して、コピペで十分ですけど。

投稿2017/11/14 09:06

編集2017/11/14 09:14
kiichi54321

総合スコア1984

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

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

退会済みユーザー

退会済みユーザー

2017/11/14 09:56

質問者さんがやりたいこと(把握されてますか?)に対するストレートな回答をもっと具体的に書いていたけませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問