C#

C# チャートデータからローソク足を描画する方法

Form上にローソク足を表示するグラフ描画のサンプルプログラムです。チャートデータは下記のCSVを使っています。

C#ローソク足

Formにローソク足を描画

こちらはForm上にローソク足のチャートを描画するサンプルプログラムです。Formの初期起動時にグラフ描画をするようになっています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace Study
{
    public partial class Top : Form
    {
        public Top()
        {
            InitializeComponent();
            Init();
        }

        /// <summary>
        /// チャートデータを取得してローソク足を表示します
        /// </summary>
        private void Init()
        {
            Chart Candle = new Chart();
            Candle.Size = this.ClientSize;
            this.Controls.Add(Candle);

            // トレンドラインエリアの領域
            ChartArea area = new ChartArea("AREA");
            Candle.ChartAreas.Add(area);

            // グラフ種類
            Series series = new Series("CANDLE");
            series.ChartType = SeriesChartType.Candlestick;
            Candle.Series.Add(series);

            // チャートデータ取り込み
            DataTable dt = this.CsvRead();

            // グラフY軸の最大値と最小値
            double[] Yval = this.MaxMin(dt);

            // タイトル
            Candle.Titles.Add("EUR/USD");

            // タイトルカラー
            Candle.ChartAreas[0].AxisY.TitleForeColor = Color.White;

            // ローソク足の間隔
            Candle.Series["CANDLE"]["PointWidth"] = "0.6";

            // ローソク足の色
            Candle.Series["CANDLE"]["PriceUpColor"] = "Red";
            Candle.Series["CANDLE"]["PriceDownColor"] = "DarkBlue";

            // 凡例非表示
            Candle.Series[0].IsVisibleInLegend = false;

            // チャートカラーの設定
            Candle.BackColor = Color.FloralWhite;
            Candle.ChartAreas[0].BackColor = Color.Transparent;

            // グリッド線
            Candle.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.DarkBlue;
            Candle.ChartAreas[0].AxisX.LabelStyle.ForeColor = Color.DarkBlue;
            Candle.ChartAreas[0].AxisY.LabelAutoFitMaxFontSize = 8;
            Candle.BorderColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
            Candle.ChartAreas[0].AxisY.MajorGrid.LineColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisX.MajorGrid.LineColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisY.MinorGrid.Enabled = false;
            Candle.ChartAreas[0].AxisY.MinorGrid.LineColor = ColorTranslator.FromHtml("#008242");

            // Y軸の範囲
            // クロス円
            //Candle.ChartAreas[0].AxisY.Maximum = Yval[0];
            //Candle.ChartAreas[0].AxisY.Minimum = Yval[1];
            //Candle.ChartAreas[0].AxisY.LabelStyle.Format = "000.000";
            // ドルストレート
            Candle.ChartAreas[0].AxisY.Maximum = Yval[0];
            Candle.ChartAreas[0].AxisY.Minimum = Yval[1];
            Candle.ChartAreas[0].AxisY.LabelStyle.Format = "0.00000";

            // 4本値の設定
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                // 高値
                Candle.Series["CANDLE"].Points.AddXY("", float.Parse(dt.Rows[i]["高値"].ToString()));
                // 安値
                Candle.Series["CANDLE"].Points[i].YValues[1] = float.Parse(dt.Rows[i]["安値"].ToString());
                // 始値
                Candle.Series["CANDLE"].Points[i].YValues[2] = float.Parse(dt.Rows[i]["始値"].ToString());
                // 終値
                Candle.Series["CANDLE"].Points[i].YValues[3] = float.Parse(dt.Rows[i]["終値"].ToString());
            }
        }
    }
}

為替データのCSVを読み込む

CsvRead();というメソッドは、下記のクラスファイルを利用しています。
CSVファイルをdatatableに読み込む方法

Y軸の最大値と最小値を設定

MaxMin(dt);というメソッドでは、読み込んだ為替データのCSVを使って、グラフY軸の最大値と最小値を設定するために為替データの高値と安値を拾ってきます。

/// <summary>
/// 最大値と最小値を取得します
/// グラフのY軸に設定します
/// </summary>
public double[] MaxMin(DataTable dt)
{
    DataRow[] data = null;
    double high = 0;
    double min = 0;

    data = dt.Select("高値 = MAX(高値)");
    foreach (DataRow datas in data)
    {
        high = double.Parse(datas["高値"].ToString());
    }

    data = dt.Select("安値 = MIN(安値)");
    foreach (DataRow datas in data)
    {
        min = double.Parse(datas["安値"].ToString());
    }            
    return new[] {high,min};
}

C# ファイルダイアログからテキストを読み込む方法

Windowフォーム上からユーザーアクションでファイルを指定してもらうときに利用するファイルダイアログを紹介します。

ここのサンプルコードは、ファイルの種類のデフォルトをCSVやテキストファイルをフィルターにしていますが、Excelファイルをデフォルトにすることも可能です。

using System.Windows.Forms;

namespace Study
{
	class FileOpenDialog
	{
        /// <summary>
        /// ファイルダイアログを開きます
        /// </summary>
        public void OpenFile()
        {
            try
            {
                OpenFileDialog openfd = new OpenFileDialog();

                openfd.Title = "ダイアログのタイトル";

                openfd.FileName = "読み込み対象のファイル名称(初期文字列)";

                openfd.Filter = "テキスト ファイル|*.txt;*.csv;*.log|すべてのファイル|*.*";
                //openFileDialog.Filter = "Excelファイル(*.xls;*.xlsx)|*.xls;*.xlsx";

                openfd.FilterIndex = 2; // ファイルの種類

                openfd.RestoreDirectory = true; // 現在のディレクトリを復元

                openfd.Multiselect = false; // 複数ファイルの選択は許可しない

                openfd.ShowHelp = false;

                if (openfd.ShowDialog() == DialogResult.OK)
                {
                    // 正常処理
                }
                else
                {
                    // エラー処理
                }

                openfd.Dispose();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
	}
}

C# Webページのデータを取得する方法

C#を使ってWebページのデータを取得できるサンプルプログラムを作成しました。背景としては、業務で10社以上ある競合他社のホームページから手動で情報収集を行っていた部署があったため、なるべく楽に情報収集できるように、このプログラムを作成しました。

指定したWEBページのデータを取得する

WEBページからデータを取得するために、WebBrowserコントロールをサブクラス化してNonDispBrowserクラスを作成します。

こちらのサブクラスは、ITmediaさんのソースを丸パクリしてますので、詳細はリンク先でご確認ください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Study
{
    public class NonDispBrowser : WebBrowser
    {
        bool done;

        // タイムアウト時間(10秒)
        TimeSpan timeout = new TimeSpan(0, 0, 10);

        /// <summary>
        /// ページにフレームが含まれる場合にはフレームごとに
        /// このメソッドが実行されるため実際のURLを確認します
        /// </summary>
        /// <param name="">なし</param>
        protected override void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == this.Url)
            {
                done = true;
            }
        }

        /// <summary>
        /// ポップアップ・ウィンドウの抑制します
        /// </summary>
        /// <param name="">なし</param>
        protected override void OnNewWindow(CancelEventArgs e)
        {
            e.Cancel = true;
        }

        /// <summary>
        /// 実行エラーとなるスクリプト(Javascript)が含まれる場合
        /// エラーダイアログが表示されないように抑制します
        /// </summary>
        /// <param name="">なし</param> NonDispBrowser
        public NonDispBrowser()
        {
            // スクリプト・エラーを表示しない
            this.ScriptErrorsSuppressed = true;
        }

        /// <summary>
        /// 指定したWEBページの取得
        /// 取得完了までWaitします
        /// </summary>
        /// <param name="">なし</param>
        public bool NavigateAndWait(string url)
        {

            base.Navigate(url); // ページの移動

            done = false;
            DateTime start = DateTime.Now;

            while (done == false)
            {
                if (DateTime.Now - start > timeout)
                {
                    // タイムアウト
                    return false;
                }
                Application.DoEvents();
            }
            return true;
        }
    }
}

HTML内のclass名から場所を特定する

HTMLのタグを見ると、idやclass名といったものが記述されているのが分かると思います。このidやclass名を利用して、取得したいデータの位置を特定します。ここで作成したサンプルは、tableタグ内のデータを取得するサンプルコードとなっています。

using System.Windows.Forms;

namespace Study
{
    class GetHtml
    {
        NonDispBrowser ndb = new NonDispBrowser();

        /// <summary>
        /// HTMLの要素を取得します
        /// </summary>
        public void PrintDom()
        {
            ndb.NavigateAndWait("URL");
            HtmlDocument doc = ndb.Document;

            foreach (HtmlElement table in doc.GetElementsByTagName("table"))
            {
                // テーブルレコード
                foreach (HtmlElement tr in table.GetElementsByTagName("tr"))
                {
                    // 指定したclass名に一致した場合
                    if (tr.GetAttribute("domのclass名") == "class名")
                    {
                        // テーブルデータ
                        foreach (HtmlElement td in tr.GetElementsByTagName("td"))
                        {
                            // 指定したclass名に一致した場合
                            if (td.GetAttribute("className") == "class名")
                            {
                                string txt = td.InnerText;
                            }
                        }
                    }
                }
            }
        }
    }
}

C#でOutlook2010を使ったメール送信方法

C#でOutlookのメールを簡単に送信する方法を紹介します。ここで紹介しているサンプルプログラムは、静的な文字列を件名や本文に出力していますが、応用すればデータベースから取得した値を出力したり、文字列を変更したりと動的にメールを送信することも可能です。

メール送信のサンプルプログラム

using System.Net.Mail;

namespace SendMail
{
    class OutlookController
    {
        /// <summary>
        /// メールを送信します
        /// </summary>
        public void SendMail()
        {
            try
            {
                MailMessage msg = new MailMessage();

                //送信者
                msg.From = new MailAddress("送信者のアドレス");
                //宛先(To)
                msg.To.Add(new MailAddress("宛先のアドレス1"));
                msg.To.Add(new MailAddress("宛先のアドレス2"));
                //宛先(Cc)
                msg.CC.Add(new MailAddress("CCのアドレス1));
                msg.CC.Add(new MailAddress("CCのアドレス2"));
                //件名
                msg.Subject = "件名";
                //本文
                msg.Body = "本文";

                System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
                smtp.Host = "ホスト名";//SMTPサーバーを指定
                smtp.Port = 25;//(既定値は25)
                smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
                smtp.Send(msg);

                msg.Dispose();
                smtp.Dispose();//(.NET Framework 4.0以降)
            }
            catch(System.Exception e)
            {
                Console.Write(e.GetType().FullName + "の例外が発生しました。");
            }
        }
    }
}

ここのサンプルで紹介しているエンコードは、UTF-8のBase64で送信されます。

アセンブリ参照

「using System.Net.Mail;」を追加するだけでメール送信が簡単にできます。

SMTPのホスト名の調べ方

「smtp.Host = “ホスト名”;」には、利用しているメール環境のSMTPホスト名を記述します。調べ方は、下記のとおりです。

SMTP調べ方1Outlook2010を起動したら左上にあるファイルをクリックします。

 

 

 

 

SMTP調べ方2

ファイルをクリックするとアカウント設定の項目が表示されるので、そこをクリックします。

SMTP調べ方3

アカウント設定画面から変更というプロパティをクリックします。

SMTP調べ方4

アカウントの変更画面で「送信メールサーバー(SMTP)」という項目があるので、そこに設定している情報を「smtp.Host = “ホスト名”;」に記述します。

 

C#でHTMLのtableタグを生成する方法

ルーチンワークで決められたHTMLファイルのタグを自動生成したい時、業務改善の一環でツールで作成できる方法をご紹介します。

HTMLのtableタグ自動生成

こちらのサンプルは、CSVファイルのデータを読み込んでHTMLのtableタグに値を埋め込んで出力する処理です。

/// <summary>
/// HTMLのtableタグを生成します
/// </summary>
public void CreateTag()
{
  try
  {
    string tag = "";
    DataTable dt = csv.CsvReader("パス名", "CSVファイル名");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        tag += "<tr>" + "\r\n" +
                    "<th class=\"no\">" + dt.Rows[i]["NO"].ToString() + "</th>" + "\r\n" +
                    "<td class=\"kokugo\">" + dt.Rows[i]["国語"].ToString() + "</td>" + "\r\n" +
                    "<td class=\"sugaku\">" + dt.Rows[i]["数学"].ToString() + "</td>" + "\r\n" +
                    "<td class=\"eigo\">" + dt.Rows[i]["英語"].ToString() + "</td>" + "\r\n" +
               "</tr>" + "\r\n";
    }
    textBox.Text = tag;
  }
  catch(Exception ex)
  {
    MessageBox.Show(ex.GetType().FullName + "の例外が発生しました。");
  }
}

CsvReaderは、本サイトでつくったCSVをdatatableに読み込むためのクラスメソッドです。

textBox.Textは、フォーム上のテキストBOXに出力しています。
HTMLは文字列の塊のようなものなので、このようにあらかじめ決まったタグをプログラムで生成することができます。

C# JSONファイルからLINQを使って集計する方法 – 勝率の算出

DynamicJSONを使ってJSONファイルの解析後、LINQで勝率を算出する方法を紹介します。

下記にあるサンプルコードは、Webサーバーからhttp通信でJSONファイルを取得したことを前提になっています。前提条件を詳しく知りたい方は、下記のリンクを参照してください。

DynamicJSONを使うための前提条件

/// <summary>
/// 勝率を算出します
/// </summary>
/// <param name="json"></param>
/// <returns>WinningPercentage</returns>
public dynamic WinPercent(dynamic json)
{
    // 試合を行った回数を取得
    var totalCnt = from Table in ((Data[])json)
                   where Math.Abs(Table.cntflg) != 0
                   select new { Table.cntflg };

    // 試合回数の合計算出
    var totalSum = totalCnt.Select(total => total.cntflg).Count();


    // 勝ちフラグの回数を取得
    var winCnt = from Table in ((Data[])json)
                 where Table.balance > 0
                 select new {Table.winflg};

    // 勝ち回数の合計算出
    var winSum = winCnt.Select(win => win.winflg).Count();

    // 勝率
    double winPer = (double)winSum / totalSum;

}

/// <summary>
/// JSONファイルのデータ構造を定義します
/// </summary>
public class Data
{
    public int cntflg { get; set; }
    public int winflg { get; set; }
}

C# JSONファイルからLINQを使って集計する方法 – 合計値

DynamicJSONを使ってJSONファイルの解析後、LINQで合計値を算出する方法を紹介します。

下記にあるサンプルコードは、Webサーバーからhttp通信でJSONファイルを取得したことを前提になっています。前提条件を詳しく知りたい方は、下記のリンクを参照してください。

DynamicJSONを使うための前提条件

/// <summary>
/// JSONファイルから合計値を算出します
/// </summary>
public void JsonParth()
{
    string url = "JSONファイルが格納されたURL"
    var dc = new Decompression();

    try
    {
        // JSON形式のデータを取得
        string jsonString = dc.DownloadString(url);

        // JSONをパース(解析)
        var result = DynamicJson.Parse(jsonString);

        // 合計値を算出
        int total = ((Data[])json).Select(sig => sig.tensu).Sum();

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

/// <summary>
/// JSONファイルのデータ構造を定義します
/// </summary>
public class Data
{
    public int tensu { get; set; }
}

C# Webサーバーからhttp通信でファイルを取得する方法

ここでは、WebClientを使ってWebサーバーからhttp通信でファイルを取得するサンプルコードを紹介します。

WebClientのクラス

このクラスは、Webサーバーとhttp通信するためのクラスです。なお、ここでは、サーバー上にcompress(圧縮)でgzipされていることを想定しています。

DecompressionMethodsを使ってgzipを解凍するよう指示しています。

using System.Net;は、参照設定に「Sustem.Net.Http」を追加すれば利用できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; //WebClient

namespace SampleCode
{
    class Decompression : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            return request;
        }
    }
}

C# JSONファイルの読み込み方法

DynamicJSONを使ってJSONファイルの解析方法(デシリアライズ)を紹介します。

なお、DynamicJSONを利用する前提条件は、.NET Framework 4.0以上です。

ここのサンプルコードは、WebサーバーからJSONファイルをWebClientで取得し、クライアントPCでパース(解析)を行っています。

jsonファイルの解析

スポンサーリンク

DynamicJSONを使う前準備

DynamicJson – CodePlexから下記のダウンロードボタンを押してDynamicJson_1.2.0.0.zipを解凍してください。

download-codeplex

参照設定の追加

プロジェクトの参照設定から「DynamicJson.dll」を追加してください。

参照設定1 参照設定2

WebClientのクラス

このクラスは、Webサーバーとhttp通信するためのクラスです。なお、JSONファイルは、サーバー上にcompress(圧縮)でgzipされていることを想定しています。

DecompressionMethodsを使ってgzipを解凍しています。

using System.Net;は、参照設定に「Sustem.Net.Http」を追加すれば利用できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; //WebClient

namespace SampleCode
{
    class Decompression : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            return request;
        }
    }
}

JSONファイルのパース(解析)

usingでDynamicJsonを追加してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Compression; //gzip
using Codeplex.Data;         //DynamicJson
using System.Net;            //WebClient

namespace SampleCode
{
    class JsonParse
    {
        /// <summary>
        /// DynamicJsonを使ってgzipで圧縮されている
        /// JSON形式のデータをHTTP通信で取得
        /// </summary>
        public void JsonParth()
        {
            string url = "JSONファイルが格納されたURL"
            var dc = new Decompression();

            try
            {
                // JSON形式のデータを取得
                string jsonString = dc.DownloadString(url);

                // JSONをパース(解析)
                var result = DynamicJson.Parse(jsonString);

                // 必要な項目だけ引っ張りたい場合
                var json = result["ほしい項目名"];

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

Android Studio ビルドすると日本語が文字化けする2つの対応方法

ソースコードにコメントなど日本語を使用すると文字化けするときの対応方法を紹介します。

デフォルトをUTF-8にすることで日本語の文字化けを解決することができます。

ソースコード上の日本語文字化け対応方法

File(ファイル)>Settings(設定)からEditor>File Encodingsを選択してください。

Project Encoding:をUTF-8に変更して適用してください。

Android Studioの日本語文字化け対応方法

Gradleビルド時に日本語文字化け対応方法

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
}
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

build.gradleの一番下にencodingをUTF-8に指定すればOKです。