質の悪いOCR読み取りの結果を明らかにしようとしていますが、安全に推測できるすべてのものを削除しようとすると間違いです。
目的の結果は6桁の数値文字列であるため、結果から1桁ではない文字を除外できます。また、これらの番号が順番に表示されることも知っているので、順序が正しくない番号も正しくない可能性が非常に高くなります。
(はい、品質を修正するのが最善ですが、いいえ...彼らはドキュメントを変更しない/変更できません)
空白はすぐTrim()
に削除します。空白はファイル名になってしまうため、不正な文字もすべて削除します。
どの文字が数字であるかを見つけ、それらが見つかった配列の位置に対して辞書に追加しました。これにより、数のシーケンスを明確に視覚的に示すことができますが、プログラムにこれを認識させる方法のロジックに苦労しています。
文字列" Oct'、2 $ 3622 "(実際の不正な読み取り)でテスト済みこれの理想的な出力は " 3662 "
public String FindLongest(string OcrText)
{
try
{
Char[] text = OcrText.ToCharArray();
List<char> numbers = new List<char>();
Dictionary<int, char> consec = new Dictionary<int, char>();
for (int a = 0; a < text.Length; a++)
{
if (Char.IsDigit(text[a]))
{
consec.Add(a, text[a]);
// Won't allow duplicates?
//consec.Add(text[a].ToString(), true);
}
}
foreach (var item in consec.Keys)
{
#region Idea that didn't work
// Combine values with consecutive keys into new list
// With most consecutive?
for (int i = 0; i < consec.Count; i++)
{
// if index key doesn't match loop, value was not consecutive
// Ah... falsely assuming it will start at 1. Won't work.
if (item == i)
numbers.Add(consec[item]);
else
numbers.Add(Convert.ToChar("#")); //string split value
}
#endregion
}
return null;
}
catch (Exception ex)
{
string message;
if (ex.InnerException != null)
message =
"Exception: " + ex.Message +
"\r\n" +
"Inner: " + ex.InnerException.Message;
else
message = "Exception: " + ex.Message;
MessageBox.Show(message);
return null;
}
}