提问人:coder rock 提问时间:11/17/2023 最后编辑:Priyanka Vadhwanicoder rock 更新时间:11/17/2023 访问量:95
如何使用 c 使用简单的字符串准确地实现键/值对最大值#
How to achieve key/value pair max accurately with simple string using c#
问:
我有一个简单的字符串值行,其中包含以下内容。
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"];
下面是调试器中的输出
文本字符串包含一些不需要的单词,例如自动生成的徽标和账单,不需要将这些单词添加到键/值对中。请建议如何准确地达到这个最大值,并使用terrasact OCR将从图像文件中获取的字符串数据转换为文本字符串
答:
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 西曼
评论
string.Split
Name
mobile
address