如何使用 c 使用简单的字符串准确地实现键/值对最大值#

How to achieve key/value pair max accurately with simple string using c#

提问人:coder rock 提问时间:11/17/2023 最后编辑:Priyanka Vadhwanicoder rock 更新时间:11/17/2023 访问量:95

问:

我有一个简单的字符串值行,其中包含以下内容。

logo Name raj mobile 9038874774 address 6-98 india bill auto generated

现在我正在尝试键/值对来实现我的详细信息和期望如下的对值输出

[0] Key: Name  value:Raj
[1] Key: Mobile value:9038874774
[2] Key: Address value:6-98 india

下面是试图实现要求的代码

string[] lines = new string[] { "logo Name raj mobile 9038874774 address 6-98 india bill auto generated" };
   
// Get the position of the empty sign within each line

var pairs = lines.Select(l => new { Line = l, Pos = l.IndexOf(" ") });

// Build a dictionary of key/value pairs by splitting the string at the empty sign
var dictionary = pairs.ToDictionary(p => p.Line.Substring(0, p.Pos), p => p.Line.Substring(p.Pos + 1));

// Now you can retrieve values by key:
var value1 = dictionary["Name"]; 

下面是调试器中的输出

enter image description here

文本字符串包含一些不需要的单词,例如自动生成的徽标和账单,不需要将这些单词添加到键/值对中。请建议如何准确地达到这个最大值,并使用terrasact OCR将从图像文件中获取的字符串数据转换为文本字符串

C# asp.net asp.net-core

评论

1赞 Andrew S 11/17/2023
可能的密钥列表是否已知?也许使用然后迭代,每次找到键时,都使用该键作为键,那么该键的值直到找到下一个键。string.Split
0赞 coder rock 11/17/2023
是的,姓名,手机和地址是我的钥匙,请您提供代码的答案将对我有很大帮助。@AndrewS
0赞 Mark Seemann 11/17/2023
如果 、 和 是密钥,那么预期的地址应该是“6-98 india bill auto generated”?如果不是,那么规格是什么?Namemobileaddress
0赞 coder rock 11/17/2023
地址应该是“6-98 india”,只有这么多,只意味着字符串中有一些不需要的数据,我们也可以从字符串中删除。我的议程要求是这样的:nanonets.com/blog/how-to-ocr-purchase-orders-for-automation/......@MarkSeemann
0赞 coder rock 11/17/2023
如果你提供你的答案,对我有很好的帮助。@MarkSeemann

答:

1赞 Andrew S 11/17/2023 #1

下面是一个使用字符串的示例。分裂。我更改了以匹配键的大小写,因此您可能需要处理大小写问题。此外,我假设 Bill 是一个可以安全忽略的密钥(与 @Mark Seemann 在评论中提出的担忧相同。line

但是,还有其他潜在的关键问题,例如,如果名称值为 Bill,该怎么办?

private static readonly HashSet<string> _extractKeys = new() { "Name", "Mobile", "Address" };
private static readonly HashSet<string> _ignoredKeys = new() { "Bill" };

public static void Main(string[] args)
{
    var line = "logo Name raj Mobile 9038874774 Address 6-98 india Bill auto generated";
    var splitLine = line.Split(' ');

    var pairs = new Dictionary<string, string>();

    for (var i = 0; i < splitLine.Length; i++)
    {
        var candidateKey = splitLine[i];
        if (!_extractKeys.Contains(candidateKey))
        {
            continue;
        }

        var value = "";
        for (var v = i + 1; v < splitLine.Length; v++)
        {
            var candidateValuePart = splitLine[v];
            if (_ignoredKeys.Contains(candidateValuePart) || _extractKeys.Contains(candidateValuePart))
            {
                i = v - 1;
                break;
            }

            value = value + candidateValuePart + " ";
        }

        pairs.Add(candidateKey, value.Trim());
    }

    foreach (var kv in pairs)
    {
        Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
    }
}

评论

0赞 coder rock 11/17/2023
谢谢,你的代码工作得很好,你的努力和逻辑都很棒。@Andrew S
0赞 coder rock 11/17/2023
您能否在代码的每一行上添加注释,以便更好地理解代码。@Andrew S
0赞 coder rock 11/19/2023
您能否建议更多示例数据。如果名字是“John W. Smith”会发生什么。我还需要更多地址样本不是固定的 na。如何管理这些事情。@Andrew S
1赞 Mark Seemann 11/17/2023 #2

看起来确实是一个解析问题,但快速而肮脏的实现可能是这样的:

private static IDictionary<string, string> Parse(string input)
{
    var keys = ImmutableHashSet.Create(
        StringComparer.OrdinalIgnoreCase, "Name", "Mobile", "Address");
    var ignoredKeys = ImmutableHashSet.Create(StringComparer.OrdinalIgnoreCase, "Bill");
    var allKeys = keys.Union(ignoredKeys);
    var dict = new Dictionary<string, string>();

    string? currentKey = null;
    foreach (var word in input.Split(' '))
    {
        if (allKeys.TryGetValue(word, out var key))
        {
            if (key != null)
                dict[key] = "";
            currentKey = key;
        }
        else if (currentKey != null && dict.TryGetValue(currentKey, out var s))
            dict[currentKey] = (s + " " + word).Trim();
    }

    return new Dictionary<string, string>(dict.ExceptBy(ignoredKeys, kvp => kvp.Key));
}

在这里,我假设这也是一种应该被忽略的关键。"bill"

评论

0赞 coder rock 11/17/2023
您能否建议更多示例数据。如果名字是“John W. Smith”会发生什么。我还需要更多地址样本不是固定的 na。如何管理这些事情。@Mark 西曼