2016-10-18 17 views
0

大きなデータファイルを読み込み、.datファイルの各行から特定のテキストを返すアプリケーションを作成します。下記のデータの例をご覧ください。一定量のデータを読み込む

22/06/2016 22:18:21.209 TYPE6 -92.31435 2.06424 0.07686
22/06/2016 22:18:21.210 Type34 -91.4085 1.84464 -0.09333

Iは最初の3を必要とします日付、時刻およびタイプであるデータのセット。型の後の値はしばらくの間続き、私は収集する必要がある大量の行を持っています。私はラインの各セクションを分割し、最初の3つのフィールドを取ることについて考えました。これが機能するのでしょうか、これを完了するための簡単な方法がありますか?

おかげ

+0

1行の長さはどのくらいですか? –

+0

各行にRegex.Matchメソッドを使用しようとしましたか?サンプルはここにあります:https://msdn.microsoft.com/pl-pl/library/twcw2f1c(v=vs.110).aspx – Misiakw

+0

1行の長さはスペースを含めて約199文字ですが、他のデータも含まれています長くても短くても – Englishman

答えて

1

正しい方法です(3つのフィールドを抽出する)。文脈では、Linqを使用することをお勧めします。このLINQのは、あなたが簡単にフィルタアウトは、例えば、に必要なデータを表すことができ照会ました

var source = File 
    .ReadLines(@"C:\MyData.dat") 
    .Select(line => line.Split(new char[] { ' ' }, 4)) 
    .Where(items => items.Length >= 3) // it seems that you have empty lines or something 
    .Select(items => new { 
    // Let's combine date and time into DateTime 
    date = DateTime.ParseExact(items[0] + " " + items[1], 
           @"dd/MM/yyyy H:m:s.fff", 
           CultureInfo.InvariantCulture), 
    kind = items[2] }); 
// .ToArray(); // you may want add materialization (i.e. read once and put into array) 

var test = source 
    .Where(item => item.date > DateTime.Now.AddDays(-3)) // let's have fresh records only 
    .OrderByDescending(item => item.date) 
    .Select(item => $"{item.date} {item.kind}"); 

Console.Write(string.Join(Environment.NewLine, test)); 
+0

助けてくれてありがとうございました。あなたのコードを暗示しようとすると少し問題に遭遇しました。下のリンクをご覧ください。 – Englishman

+0

http://imgur.com/a/Tt1Ql – Englishman

+0

@Englishman:ファイルに*空の行*などがあるようですので、分割するとアイテムが少なすぎます(空白の場合はゼロ)、例外がスローされます3dの項目を尋ねるとき、 'items [2]'に。そのような行を除外するために '.Where(items => items.Length> = 3)'を追加することをお勧めします。 –

0

あなただけの各行の最初の文字を読むために何かを作ることができますが、あなたはすべてのデータを読み取るために持っているので、ラインの長さは、どこにも指定されていません。

File.ReadLines(path)はデータを遅延読み込みするため使用する必要があります。これは、反復ごとに1行だけを読み込みます。あなたが必要なものデータをチェックし、何が好きで、それを保存する必要がありますforeachライン...

var relevantData = new List<T>(); 
foreach(var line in File.ReadLines(path)) 
{ 
    // parse the data you need. 
    relevantData.Add(new T { Date = whatever, ..... }); 
} 

あなたはそれを複数回解析する必要がある場合は、の開始インデックスが含まれているインデックスファイルを作成することができます各行。

関連する問題