CSVデータを取得・編集しTXTに保存する方法
Excel2016のVBAで、ある時系列のCSVファイルのデータを取得・編集し、テキストファイルに保存する方法についてなんですが、やりたいことの順序としては次の通りです。
■1. CSVファイルの保存先が特定されていないため、ダイアログで開くファイルを指定します。ただ、開く際、1ヶ月の短い期間であってもExcelの最大行数1,048,576行を軽く超えてしまうため、テキストファイルで開きます。
■2. 開かれたファイルのデータを取得・編集します。
テキストファイルで開いたデータは、1行目から順に次のようになっています。
1行目は文字列
2003.05.04 21:00:00.626,118.99,118.94,20.8,0.6
2003.05.04 21:00:00.989,118.969,118.949,44.4,54.3
2003.05.04 21:00:01.408,118.958,118.948,28.7,0.8
2003.05.04 21:00:01.741,118.957,118.942,0.5,15.7
2003.05.04 21:00:22.638,118.953,118.943,0.5,37.7
2003.05.04 21:00:25.348,118.96,118.94,60.5,35.7
2003.05.04 21:00:26.087,118.956,118.946,8,13.6
2003.05.04 21:00:27.984,118.956,118.952,23.9,8.4
2003.05.04 21:00:49.884,118.968,118.948,3.2,47.1
2003.05.04 21:00:55.855,118.972,118.952,52.7,39.1
2003.05.04 21:01:05.362,118.971,118.961,21.5,4
2003.05.04 21:01:21.012,118.983,118.958,0.6,38.3
2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1
2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1
2003.05.04 21:01:52.171,118.987,118.967,47.1,39.1
2003.05.04 21:02:05.014,118.982,118.972,0.8,8.5
2003.05.04 21:02:06.232,118.985,118.965,0.9,30.9
2003.05.04 21:02:15.026,118.983,118.963,7.6,40.5
2003.05.04 21:02:19.716,118.979,118.959,11.7,32
2003.05.04 21:02:31.766,118.971,118.961,0.6,53.5
2003.05.04 21:02:49.565,118.975,118.955,8,54.3
2003.05.04 21:03:01.095,118.973,118.953,12,74
2003.05.04 21:03:12.396,118.968,118.958,31.9,64.7
~
最終行は改行
1行目は単なる文字列で、不要なデータのため除きます。
必要なデータは2行目からで、必ず、次のような形式になっています。
「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「半角スペース」、「時間2桁」、「:」、「分2桁」、「:」、「秒小数点3桁」、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「数値」(小数点桁数変動)
ちなみに、データが飛ぶことがありますが、必ず時系列になっており、恐らく途中で空白の改行はありません。
そして、データ取得に必要なデータは、年月日と時刻、2つ目の数値です。
上記のデータの2行目の例だとすると、次のようになります。
2003.05.04 21:00:00.626(●必要),118.99(×不要),118.94(●必要),20.8(×不要),0.6(×不要)
次に編集するのは、同じ1分以内の年月日と時刻の「1分間隔の年月日と時刻」、「最初の数値」、「最大値」、「最小値」、「最後の数値」、「1分間のデータの個数」で、1分間隔にしてもらいたいのです。
同じ1分以内の年月日と時刻というのは、「**:**:00.000」から「**:**:59.999」までの間です。「21:01」であれば、「21:01:00.000」から「21:01:59.999」までということになります。
例えば、「2003.05.04 21:01」であれば、上記のデータから抜き出すと次のようになります。また、1分間のデータの個数は5となります。
2003.05.04 21:01:05.362,118.971,118.961(最初の数値),21.5,4
2003.05.04 21:01:21.012,118.983,118.958(最小値),0.6,38.3
2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1
2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1
2003.05.04 21:01:52.171,118.987,118.967(最大値、最後の数値),47.1,39.1
恐らく、同じ1分以内の年月日と時刻のデータが1個だけということはないと思いますがその場合、「最初の数値」、「最大値」、「最小値」、「最後の数値」は全て同じ数値となります。
そして、出力する際、次のような形式にします。
「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「,」、「時間2桁」、「:」、「分2桁」、「,」、「最初の数値」、「,」、「最大値」、「,」、「最小値」、「,」、「最後の数値」、「1分間のデータの個数」
「2003.05.04 21:01」であれば、編集結果は次のようになります。
2003.05.04,21:01,118.961,118.967,118.958,118.967,5
これを1分間隔で時系列に沿って1行目から、
2003.05.04,21:01~
2003.05.04,21:02~
2003.05.04,21:03~
~
のようにします。
変数を使うのであれば、各変数名を次のようにしてもらいたいです。
「最初の数値」を、Open、
「最大値」を、High、
「最小値」を、Low、
「最後の数値」を、Close、
「1分間のデータの個数」を、Volume
■3. ダイアログで開くように指定し、保存先を決め、編集したデータが入ったテキストファイルが自動的に作成され、保存できるようにします。
ファイル名は、
「元のCSVファイルの左から6文字目まで」、「_」、「最初のデータの西暦4桁」、「.」、「最初のデータの月2桁」、「.」、「最初のデータの日にち2桁」、「.」、「最初のデータの時間4桁」(「:」を除いた時間と分)、「-」、「最後のデータの西暦4桁」、「.」、「最後のデータの月2桁」、「.」、「最後のデータの日にち2桁」、「.」、「最後のデータの時間4桁」(「:」を除いた時間と分)
と自動的にファイル名が付けられるようにしてもらいたいです。
例えば、次のような感じです。
******_2003.05.04.2100-2003.05.30.1459
少し調べたのですが、CSVファイルを開くプログラムは分かったのですが、それ以降のテキストファイルで開き、データを取得などは分かりませんでした。
自分が不勉強で申し訳ないのですが、可能であればこれらのVBAによるプログラムを教えてください。
回答よろしくお願いします。
お礼
迅速に回答をいただいて、すごく助かりました! lastIndexOfで、"-"の場所を取得して、substringでそれ以降の文字だけ ちゃんと取れました! lastIndexOfは知らなかったので勉強になりました、ありがとうございました。