1日の終わりに作成される2つのレポートがあります。月末に分析できるようにしたいと思います。
各ファイルの中には、1000行ほどの長いASCII文字列があります。これは正常にコーディングされていますが、一度に1つのファイルを抽出して分析を実行するためだけです。
以下のコードの関連する構造を試してみます。これで、何をする必要があるかを理解するのに十分だと思います。そうでない場合は、すべてを投稿させていただきます。
using (StreamReader reader = new StreamReader("YYYYMMDD----1234D.dat"))
{
while loop //this goes through all the lines in the file.
{if //if meets certain criteria then store into a list, otherwise ignore
}
foreach // this part does the analysis of all the values in the list, totals, etc
。
最初のレポートは上記の形式であり、もう1つは1234Dの代わりに異なる番号を持っています(引数のために、5678D、つまりyyyymmdd ---- 5678D)。これらの数値は両方とも全体を通して一定です。
すべてのファイルからすべてのデータをリストに保存し、毎日の内訳ではなく、月全体で分析を実行できるようにしたいので、各ファイルがループするようになります。ファイルの終わりに、名前を1日ずつインクリメントし、それをループします(または、月がXのすべてのファイルを検索します-どちらか良い方)。これによりリストにデータが入力され、foreachが分析と出力を実行します。必要なすべてのファイルを、プログラムで現在使用されているものと同じフォルダーに入れることが期待されています。
現在のコード:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
class Program
{
public class EntryLine
{
public int I { get; set; }
public string LineStart { get; set; }
public string Letters { get; set; }
public int TVolume { get; set; }
public long TPrice { get; set; }
public double MVolume { get; set; }
public string Currency { get; set; }
public string DateTime {get; set; }
}
static void Main(string[] args)
{
List<EntryLine> myList = new List<EntryLine>();
int i = 1;
using (StreamReader reader = new StreamReader("20121203----1234D.dat"))
{
string line;
var locations = new Dictionary<string, int[]>() {
{"210", new [] {405, 4, 128, 12, 141, 12, 247, 15, 121, 3}},
{"310", new [] {321, 4, 112, 12, 125, 12, 230, 15, 105, 3}},
{"410", new [] {477, 4, 112, 12, 125, 12, 360, 15, 105, 3}}
};
while ((line = reader.ReadLine()) != null)
{
var lineStart = line.Substring(0, 3);
if (lineStart == "210" || lineStart == "310" || lineStart == "410")
{
var currentLocations = locations[lineStart];
var letters = line.Substring(currentLocations[0], currentLocations[1]);
var tvolume =
int.Parse(line.Substring(currentLocations[2], currentLocations[3])) +
int.Parse(line.Substring(currentLocations[4], currentLocations[5]));
var tprice = long.Parse(line.Substring(currentLocations[6], currentLocations[7]));
var mvolume = tprice * tvolume * 0.01 * 0.0000001;
var currency = line.Substring(currentLocations[8], currentLocations[9]);
myList.Add(new EntryLine()
{
I = i,
LineStart = lineStart,
Letters = letters,
TVolume = tvolume,
TPrice = tprice,
MVolume = mvolume,
Currency = currency
});
i = i + 1;
}
}
var x = myList.GroupBy(g => new { g.Letters, g.Currency })
.Select(a => new { a.Key.Letters, a.Key.Currency, TSum = a.Sum(s => s.TVolume), MSum = a.Sum(s => s.MVolume) });
foreach (var item in x)
{
Console.WriteLine("{0} currency: {1} tvolume: {2} mVolume: {3}", item.Letters, item.Currency, item.TSum, item.MSum);
}
} Console.ReadLine();
}
}