【发布时间】:2017-10-20 17:13:55
【问题描述】:
我正在尝试找出实现以下场景的最有效方法:
我有一个这样的列表:
public static IEnumerable<string> ValidTags = new List<string> {
"ABC.XYZ",
"PQR.SUB.UID",
"PQR.ALI.OBD",
};
我有一个包含多列的巨大 CSV。其中一列是tags。此列包含空白值或上述值之一。问题是,标签列可能包含像“ABC.XYZ?@”这样的值,即有效标签加上一些无关的字符。我需要使用有效标签更新这些列,因为它们“非常匹配”我们的有效标签之一。
示例:
- 如果 CSV 包含
PQR.ALI.OBD?使用有效标签PQR.ALI.OBD更新它 - 如果CSV包含
PQR.ALI.OBA,这是无效的,只需添加后缀无效并更新它PQR.ALI.OBA-invalid。
我正在尝试找出最好的方法来做到这一点。
我目前的做法是:
- 遍历CSV中的每一列,得到tagValue
- 现在检查我们的 tagValue 是否包含列表中的任何字符串
- 如果它包含但不完全相同,则使用它包含的值更新它。
- 如果它不“包含”列表中的任何值,请添加 suffix-invalid。
有没有更好/更有效的方法来做到这一点?
更新:
列表只有 5 项,我在这里展示了 3 项。 额外的字符仅在末尾,这是因为人们在 excel 网络版本中编辑这些 CSV,这会弄乱一些条目。
我当前的代码:(我确信有更好的方法来做到这一点,在 C# 中也是新的,所以请告诉我如何改进它)。我正在使用 CSVHelper 获取 CSV 单元格。
var record = csv.GetRecord<Record>();
string tag = csv.GetField(10); //tag column number in CSV is 10
/* Criteria for validation:
* tag matches our list, but has extraneous chars - strip extraneous chars and update csv
* tag doesn't match our list - add suffix invalid.*/
int listIndex = 0;
bool valid;
foreach (var validTags in ValidTags) //ValidTags is the enum above
{
if (validTags.Contains(tag.ToUpper()) && !string.Equals(validTags, subjectIdentifier.ToUpper()))
{
valid = true;
continue; //move on to next csv row.
//this means that tag is valid but has some extra characters appended to it because of web excel, strip extra charts
}
listIndex++;
if(listIndex == 3 && !valid) {
//means we have reached the end of the list but not found valid tag
//add suffix invalid and move on to next csv row
}
}
【问题讨论】:
-
多余的字符总是在最后吗?
-
这真的是列表中仅有的三个项目吗?或者任何列表项是其他列表项的子集(例如
ABC.XYZ和ABC.XYZ.PQR)? -
你能分享你目前的方法代码吗?
-
我会更新这个问题的更多细节......谢谢。
-
@sniperd 这不是最好的。这是最简单的。它不将转置识别为单个操作。 Damerau Levenshtein 更好,但仍不如专门为模糊匹配编写的现代算法。 Damerau 创建于 60 年代