2017-06-29 6 views
0

私はC#にはかなり新しいですが、私はこの問題を解決できません(おそらく単純なものです)。c#文字列のリスト> sort by regex?

エラーログの文字列を含む2つのリストがあります。 (それは文字列の配列を使用することをお勧めします場合は、私に教えてください)

/* Example of list from host 1 
2017-06-29 02:25:54.309 BST,ERROR,....... 
2017-06-29 02:25:54.357 BST,ERROR,....... 
2017-06-29 02:25:54.495 BST,ERROR,....... 
2017-06-29 02:30:57.183 BST,ERROR,....... 
2017-06-29 03:07:12.078 BST,ERROR,....... 
2017-06-29 05:07:13.256 BST,ERROR,....... 
2017-06-29 05:14:14.717 BST,ERROR,....... 
2017-06-29 05:16:23.954 BST,ERROR,....... 
2017-06-29 08:12:16.418 BST,ERROR,....... 
2017-06-29 08:37:23.574 BST,ERROR,....... 
2017-06-29 09:07:11.569 BST,ERROR,....... */ 
List<string> filteredLogFileC1 = filterLog(hostNameC1); //filterLog returns a List<string> 

/* Example of list from host 2 
2017-06-29 00:43:43.781 BST,ERROR,....... 
2017-06-29 00:43:44.446 BST,ERROR,....... 
2017-06-29 00:43:44.885 BST,ERROR,....... 
2017-06-29 00:43:45.378 BST,ERROR,....... 
2017-06-29 00:43:45.940 BST,ERROR,....... 
2017-06-29 00:43:46.584 BST,ERROR,....... 
2017-06-29 00:43:47.141 BST,ERROR,....... */ 
List<string> filteredLogFileC2 = filterLog(hostNameC2); //filterLog returns a List<string> 

// Combine the 2 lists into one (the below practice might not be the best one but its working and I am happy at the moment :)) 

/* 
... Combined list 
2017-06-29 08:12:16.418 BST,ERROR,....... 
2017-06-29 08:37:23.574 BST,ERROR,....... 
2017-06-29 09:07:11.569 BST,ERROR,....... 
2017-06-29 00:43:43.781 BST,ERROR,....... 
2017-06-29 00:43:44.446 BST,ERROR,....... 
2017-06-29 00:43:44.885 BST,ERROR,....... 
... 
*/ 
foreach (string line in filteredLogFileC2) filteredLogFileC1.Add(line); 


// I need to sort the filteredLogFileC1 list by date. 
// Below I have a regex that I've put together but I don't know how I can use it 

Regex sortReg = new Regex(@"(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}.\d{3})"); 

Issue: filteredLogFileC1.OrderBy(???sortReg???) 

は、ご提案をいただき、ありがとうございます。

+0

で最初のものに2つ目のリストを追加するには '.AddRange'の方法があります。 –

+1

「正規表現による並べ替え」とはどういう意味ですか?最終結果はどうなりますか? –

+0

あなたの日付が常に同じ形式(そして常に年からミリ秒の順序)であれば、アルファベットの標準的な並べ替えを使用できるはずです。 –

答えて

0

Sort方法は、あなたのケースのために働くだろうが、それは(同様の日付の場合は、元の順序を保存しません)ドキュメントに基づいて安定しないので、私は(安定した)[並べ替えを使用することをお勧めします

filteredLogFileC1 = filteredLogFileC1.OrderBy(dt => dt).ToList(); 

上記のλ(dt => dt)では、次のように言っています。文字列を独自の値で並べ替えます。

文字列ではなく、Dateフィールドを持つデータ構造体の場合、そのフィールドでソートするには(dt => dt.Date)と言うことができます。ちょっと混乱させるようなラムダをクリアするだけですビット)。

0

私は前にこれを試してみましたが、うまくいきませんでした:

filteredLogFileC1.OrderBy(x => x)); // maybe I should have stored this into a new list ? 
File.WriteAllLines(localPath + "combined.log", filteredLogFileC1); 

それは私のために動作し、また、出力を生成し、この方法:

File.WriteAllLines(localPath + "combined.log", filteredLogFileC1.OrderBy(x => x)); 
+0

'OrderBy'は新しい' IEnumerable'を返し、あなたが操作しているものを更新しません。 – user3185569

0

を私はあなたの仕事の権利を理解している場合 - これは次のとおりです。

filteredLogFileC1.Union(filteredLogFileC2).OrderBy(l => sortReg.Match(l).Value) 

コード結果は次のとおりです。 IEnumerable。拡張方法.ToList()を使用して変換することができます。また、Regexが一致しない場合、結果の値は空の文字列になります。そうでなければ、目的の部分文字列になります。

0

あなたの文字列から日付を作成する必要があり、かつソート日付

var matchedLines = filteredLogFileC1.Where(x => sortReg.IsMatch(x)).OrderBy(x => DateTime.ParseExact(sortReg.Match(x).Value, "yyyy-MM-dd HH:mm:ss.fff", null)); // lines that match date pattern, ordered by date value 
var unMatchedLines = filteredLogFileC1.Where(x => !sortReg.IsMatch(x)); // Lines that do not match date pattern. Can be added at the top or bottom 
+0

一致しない場合は例外が発生します – Kantora

+0

編集済みの回答があるため、日付が日付パターンと一致しない場合に例外はありません。 –

関連する問題