C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

CSVファイルのデータ取得とインサート文の簡略化について

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■85219 / inTopicNo.1)  CSVファイルのデータ取得とインサート文の簡略化について
  
□投稿者/ 河童 (1回)-(2017/09/21(Thu) 15:30:18)

分類:[C#] 

はじめまして、河童と申します。
よろしくお願いします。

CSVファイル内のデータを複数取得して、
それをテーブルにインサートする方法を教えてください。

現状の処理のコードを簡素化したいと思っています。
アドバイス、よろしくお願いします。

1.CSVファイルについて
CSVファイルの構成は、
2行(HEAD行とDATA行)でデータの項目数が変化します。
帳票名がキーになります。
項目は1から10まであり、ファイルの中身は変化します。
DATAの値をテーブルにインサートします。
最後に読み込んだファイルを最新のデータとして、
同じ帳票名を読み込んだ場合はデリートインサートします。

帳票1.csv
HEAD,帳票名,項目1,項目2,項目3
DATA,帳票1,aaa,bbb,ccc

帳票2.csv
HEAD,帳票名,項目1,項目3,項目4,項目5
DATA,帳票2,aaa,ccc,ddd,eee

2.テーブル構成
t_chouhyou:
chouhyoumei・・・テキスト
koumoku1・・・テキスト
koumoku2・・・テキスト
koumoku3・・・テキスト
koumoku4・・・テキスト
koumoku5・・・テキスト
koumoku6・・・テキスト
koumoku7・・・テキスト
koumoku8・・・テキスト
koumoku9・・・テキスト
koumoku10・・・テキスト
toukudate・・・テキスト

3.現状の処理について
3-1最大10項目分の変数を準備
public class Chouhyou
{
public string chouhyoumei { get; set; }
public string koumoku1 { get; set; }
public string koumoku2 { get; set; }
public string koumoku3 { get; set; }
public string koumoku4 { get; set; }
public string koumoku5 { get; set; }
public string koumoku6 { get; set; }
public string koumoku7 { get; set; }
public string koumoku8 { get; set; }
public string koumoku9 { get; set; }
public string koumoku10 { get; set; }
}

private Chouhyou makeChouhyou()
{
Chouhyou ch = new Chouhyou();

ch.chouhyoumei = "";
ch.koumoku1 = "";
ch.koumoku2 = "";
ch.koumoku3 = "";
ch.koumoku4 = "";
ch.koumoku5 = "";
ch.koumoku6 = "";
ch.koumoku7 = "";
ch.koumoku8 = "";
ch.koumoku9 = "";
ch.koumoku10 = "";

return ch;
}

3-2HEADに対応するDATAを取得
  ヘッダが項目1のときのDATAを取得します。
public string CSV_GetKoumoku1(CSVLine csvList)
{
string result = "";

// 項目があるか
int touroku = csvList.csvData.Select(n => n.header).ToList().IndexOf("項目1");

// 0未満の場合なし
if (touroku < 0)
{
return "";
}

result = csvList.csvData[touroku].data;
return result;
}

3-3DATAをテーブルにインサート
引数として各項目のDATAと登録日時
public int insChouhyou(HyoujiData hyoujidata, string strdate)
{
try
{
MySqlCommand cmd;

string sql = "";
sql = string.Format("INSERT INTO t_chouhyou VALUE('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')", hyoujidata.chouhyoumei, hyoujidata.koumoku1, hyoujidata.koumoku2, hyoujidata.koumoku3, hyoujidata.koumoku4, hyoujidata.koumoku5, hyoujidata.koumoku6, hyoujidata.koumoku7, hyoujidata.koumoku8, hyoujidata.koumoku9, hyoujidata.koumoku10, strdate);

BeginTransaction();
cmd = new MySqlCommand(sql, this.conn);
cmd.ExecuteNonQuery();
CommitTransaction();

return 0;
}
catch (MySqlException ex)
{
Console.WriteLine(ex.ToString());
return -1;
}
catch
{
return -1;
}
}

4.困っていること
 CSVファイルの中身を常に最大項目数(10項目)にするのが難しいこと。
 3-2で同じ処理を10回繰り返しているので、ここでコードを簡略化したいこと。
 3-3で取得した項目をすべて並べているので、ここでコードを簡略化したいこと。
 DATAをテーブルにインサートすること自体はできているのですが、
 今後項目数が増えるかもしれないこととどうやってコードの簡略化ができるのか
 私自身の興味と勉強のため方法を知りたいです。
 何卒皆様のお知恵を拝借させてください。
 よろしくお願いします。
引用返信 編集キー/
■85220 / inTopicNo.2)  Re[1]: CSVファイルのデータ取得とインサート文の簡略化について
□投稿者/ furu (120回)-(2017/09/21(Thu) 15:57:15)
No85219 (河童 さん) に返信

投稿モードが図表モードでないと見にくいです。

> sql = string.Format("INSERT INTO t_chouhyou VALUE('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')", hyoujidata.chouhyoumei, hyoujidata.koumoku1, hyoujidata.koumoku2, hyoujidata.koumoku3, hyoujidata.koumoku4, hyoujidata.koumoku5, hyoujidata.koumoku6, hyoujidata.koumoku7, hyoujidata.koumoku8, hyoujidata.koumoku9, hyoujidata.koumoku10, strdate);

'{0}'は、SQLインジェクションなどが発生したり
項目にシングルクォーテーションが入っている場合面倒なので
使わないうがいいです。
パラメータにしましょう。

> 4.困っていること
>  CSVファイルの中身を常に最大項目数(10項目)にするのが難しいこと。
>  3-2で同じ処理を10回繰り返しているので、ここでコードを簡略化したいこと。
>  3-3で取得した項目をすべて並べているので、ここでコードを簡略化したいこと。
>  DATAをテーブルにインサートすること自体はできているのですが、
>  今後項目数が増えるかもしれないこととどうやってコードの簡略化ができるのか
>  私自身の興味と勉強のため方法を知りたいです。

配列かリストを使用すると、困っていることは解決すると思います。


引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ