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

わんくま同盟

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

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

ツリー一括表示

日が変わった時のデータ保存方法 /MASA (23/11/10(Fri) 10:20) #102504
Re[1]: 日が変わった時のデータ保存方法 /WebSurfer (23/11/10(Fri) 10:36) #102505
Re[1]: 日が変わった時のデータ保存方法 /furu (23/11/10(Fri) 12:52) #102509
Re[1]: 日が変わった時のデータ保存方法 /魔界の仮面弁士 (23/11/10(Fri) 13:58) #102511
  └ Re[2]: 日が変わった時のデータ保存方法 /MASA (23/11/10(Fri) 16:52) #102515
    └ Re[3]: 日が変わった時のデータ保存方法 /MASA (23/11/10(Fri) 17:29) #102516
      └ Re[4]: 日が変わった時のデータ保存方法 /とっちゃん (23/11/10(Fri) 20:38) #102518


親記事 / ▼[ 102505 ] ▼[ 102509 ] ▼[ 102511 ]
■102504 / 親階層)  日が変わった時のデータ保存方法
□投稿者/ MASA (1回)-(2023/11/10(Fri) 10:20:02)

分類:[.NET 全般] 

C# Windowsフォームアプリケーション .NET Framework


データ保存の方法で教えて下さい

今1秒毎にデータを日付の付いたファイルに書き込むようにしているのですが
日が変わった時にファイルの日付を変えて保存を続行したいのです
宜しくお願い致します

using System;
using System.IO;
using System.Windows.Forms;

namespace データ保存
{
    public partial class Form1 : Form
    {
        private DateTime startTime;
        private Timer timer;
        string currentDate = DateTime.Now.ToString("yyyyMd");

        private string filePath = @"C:\test\Data保存\" + DateTime.Now.ToString("yyyyMd") + ".csv";

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart1_Click(object sender, EventArgs e)
        {
            startTime = DateTime.UtcNow;
            
            timer = new Timer();
            timer.Interval = 1000; // 1秒
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void btnStop1_Click(object sender, EventArgs e)
        {
            timer.Stop();  
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            string date1 = DateTime.Now.ToString("yyyy/M/d");
            string date2 = DateTime.Now.ToString("HH:mm:ss");

            string data1 = upperData.ToString();
            string data2 = lowerData.ToString();

            SaveDataToCSV(date1, date2, data1, data2);  
        }

        private void SaveDataToCSV(string date1, string date2, string data1,string data2)
        {
            try
            {
                using (StreamWriter sw = File.AppendText(filePath))
                {
                    sw.WriteLine($"{date1},{date2},{data1},{data2}");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

[ □ Tree ] 返信 編集キー/

▲[ 102504 ] / 返信無し
■102505 / 1階層)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ WebSurfer (2795回)-(2023/11/10(Fri) 10:36:48)
No102504 (MASA さん) に返信

> private void Timer_Tick(object sender, EventArgs e)
> {
> string date1 = DateTime.Now.ToString("yyyy/M/d");
> string date2 = DateTime.Now.ToString("HH:mm:ss");
>
> string data1 = upperData.ToString();
> string data2 = lowerData.ToString();
>
> SaveDataToCSV(date1, date2, data1, data2);
> }

そこのところ、コンパイラも通らないのではないですか?

[ 親 102504 / □ Tree ] 返信 編集キー/

▲[ 102504 ] / 返信無し
■102509 / 1階層)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ furu (220回)-(2023/11/10(Fri) 12:52:07)
No102504 (MASA さん) に返信
> 今1秒毎にデータを日付の付いたファイルに書き込むようにしているのですが
> 日が変わった時にファイルの日付を変えて保存を続行したいのです
filePathの作成をFile.AppendTextの直前にするといいです。


    string filePath = @"C:\test\Data保存\" + DateTime.Now.ToString("yyyyMd") + ".csv";
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine($"{date1},{date2},{data1},{data2}");
    }

DateTime.Nowは刻々と変わるので日付と時刻を別々に取得すると不具合の元です。

    string date1 = DateTime.Now.ToString("yyyy/M/d");
    string date2 = DateTime.Now.ToString("HH:mm:ss");

例えばdate1とdate2の処理中に11/10から11/11に日付が変わると
date1は11/10の日付
date2は11/11の時刻になってしまいます。
DateTime.Nowを一旦変数に代入しましょう。

    DateTime dt = DateTime.Now;
    string date1 = dt.ToString("yyyy/M/d");
    string date2 = dt.ToString("HH:mm:ss");

[ 親 102504 / □ Tree ] 返信 編集キー/

▲[ 102504 ] / ▼[ 102515 ]
■102511 / 1階層)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ 魔界の仮面弁士 (3708回)-(2023/11/10(Fri) 13:58:46)
2023/11/10(Fri) 14:00:03 編集(投稿者)

追記:「@」を書き忘れてた

No102504 (MASA さん) に返信
> DateTime.Now.ToString("yyyyMd")

これだと、
 2024年1月23日
 2024年12月3日
の両方が "2024123" になりますよ。

せめて
 .ToString(@"yyyy\-M\-d") → 2024-1-23
 .ToString("yyyyMMdd") → 20240123
などにしておくべきでは。



さらに言えば、OS の地域設定が「和暦」モードだった場合、
yyyy は 2024 ではなく 06 を返すことになるので、
カルチャーを明示して変換するのがより望ましいです。
[ 親 102504 / □ Tree ] 返信 編集キー/

▲[ 102511 ] / ▼[ 102516 ]
■102515 / 2階層)  Re[2]: 日が変わった時のデータ保存方法
□投稿者/ MASA (2回)-(2023/11/10(Fri) 16:52:34)
魔界の仮面弁士 さん
WebSurferさん
furuさん
ありがとうございます
上記を踏まえてやってみます
[ 親 102504 / □ Tree ] 返信 編集キー/

▲[ 102515 ] / ▼[ 102518 ]
■102516 / 3階層)  Re[3]: 日が変わった時のデータ保存方法
□投稿者/ MASA (3回)-(2023/11/10(Fri) 17:29:52)
No102515 (MASA さん) に返信
> 魔界の仮面弁士 さん
> WebSurferさん
> furuさん


日付が変わった時点で新しいファイルを作りました。
ありがとうございます

もうひとつお聞きしたいのですが

日付のファイルを開いた状態でプログラムを走らすと

エラーのインフォメーションがいくつも出てしまいます
(別のプロセスで使用されているためファイルにアクセスできません)

この場合ファイルを閉じて下さいとメッセージボックスを出して
閉じたらスタート出来る様にしたいと思っています
宜しくお願い致します

[ 親 102504 / □ Tree ] 返信 編集キー/

▲[ 102516 ] / 返信無し
■102518 / 4階層)  Re[4]: 日が変わった時のデータ保存方法
□投稿者/ とっちゃん (794回)-(2023/11/10(Fri) 20:38:22)
No102516 (MASA さん) に返信
> もうひとつお聞きしたいのですが
>
> 日付のファイルを開いた状態でプログラムを走らすと
>
> エラーのインフォメーションがいくつも出てしまいます
> (別のプロセスで使用されているためファイルにアクセスできません)
>
> この場合ファイルを閉じて下さいとメッセージボックスを出して
> 閉じたらスタート出来る様にしたいと思っています

例外をキャッチしているところで、単に例外メッセージを出すだけではなく、それなりのメッセージにしておき

timer.Enabled = false;
MessageBox.Show( "以下の理由でファイルが開けません。\n"+ex.Message );
timer.Enabled = true;

というような感じで、一時的に止めてやればよいと思いますよ。

[ 親 102504 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -