有这样一个问题。有一个列表是从数据库中获取的,第二个列表是在程序中形成的。如下表所示:
id name
One my foo1 foo2 foo3
2 my fow1 foo2 foo3
...诸若此类。在程序运行期间生成的列表从文件中获取数据。并且是:
id name parent
...问题是数据库中表的列parent id number列在哪里。此时此刻,做出了这个决定:
int countMatch = 0;
foreach (var productse in prod)
{
var splitted = productse.name.Replace(" ", " ").Split(' ');
int maxmatch = splitted.Count(s => addProd.name.Contains(s));
if (maxmatch > countMatch) countMatch = maxmatch;
}
var fixedCount = addProd.name.Split(' ').Count()/1.5;// 1.5 Choose the most best rate
if (countMatch <= fixedCount && prod.All(x => !x.name.ToUpper().Contains(addProd.name.ToUpper())))
prod.Add(addProd); 在将"prod“列表加载到数据库中之后
此解决方案有效,但效果不是很好。由于某些名称最适合较小的名称,因此无法创建某些记录。
我正在尝试加载的示例数据:
Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM - name created下面的数据是通过id parent (上面的条目)获得的:
Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 BOX w/cooler
Intel Core i3-2130 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-3210 3.2GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 BOX w/cooler
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 BOX w/cooler
Intel Core i5-2500K 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics3000 TDP-95w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 BOX w/cooler需要将数据放在一个表中,如果数据与父对象的最大匹配数相似,则需要将数据放入表中。谢谢!
发布于 2013-04-04 12:57:50
你能更清楚地写出你应该做什么吗?据我所知,您希望通过识别最常见的符号将行从文本文件链接到数据库中的行,其中文本的开头是相同的。如果是错的,请纠正我。
首先尝试使用正则表达式,它是文本处理中的王者。您可以一个接一个地迭代和删除文本行中带有空格的最后一个单词。
foreach (var fProduct in fileProducts)
{
// remove blank spaces >= 2
var fProductCleared = Regex.Replace(fProduct, @"\s{2,}", "");
// search best match in data base
bool isMatched = FunctionToMatchInDB(fProductClear); // search the whole text
if(!isMatched)
{
// remove word by word from the end
while(fProductClear.Contains(' '))
{
// remove last word with space from the end of line
fProductClear = Regex.Replace(fProductClear,@"\s*[^\s]+\s*$", "");
bool isMatched = FunctionToMatchInDB(fProductClear);
if(!isMatched)
break; // TODO:
}
}
}https://stackoverflow.com/questions/15802158
复制相似问题